SQL:有/存在/除外 - 高级查询

时间:2017-08-17 09:05:34

标签: sql sql-server tsql

我有一个支持一种或多种语言的实体列表。 我有一个父实体,它也有一个必需的语言列表。 我想知道所有孩子不支持的父项所需的语言。

即: 表1:

Lang_ID, ChildContent_ID
1 A
2 B
3 B
1 B
1 C
3 C
4 C
1 D
3 D
1 E

表2:

ParentRequiredLang_IDs
1
2
3

在上面的数据中,我们看到所有孩子都有语言1支持,但只有B,C,D有语言3支持。只有B有语言2支持。父母需要语言1,2,3支持,但在儿童中缺少2和3。这是我想要的输出; 2,3。

Desired output:
2
3

如何撰写此查询?

注意:这里的两个表都是几个连接的输出,应该是动态的。我无法查询“2”和“3”。

1 个答案:

答案 0 :(得分:1)

这是一种方法。首先创建内容ID和所需语言的CROSS JOIN(以获取所需的所有组合),然后只需查找缺失值并输出它们的不同语言ID。

SELECT
    DISTINCT ParentRequiredLang_IDs AS MissingLanguages
FROM
    (SELECT i.ChildContent_ID, j.ParentRequiredLang_IDs FROM Table_1 i CROSS JOIN Table_2 j) a
LEFT OUTER JOIN
    dbo.Table_1 b ON a.ChildContent_ID = b.ChildContent_ID AND a.ParentRequiredLang_IDs = b.Lang_ID
WHERE
    b.Lang_ID IS NULL