选择一组ID值不完全存在于另一个表中的ID组

时间:2019-07-05 02:00:15

标签: sql

我有两个桌子。一个带有ID和值列表的列表(一对多)。另一个表带有值列表,这些值用于匹配第一个表中的那些值。我想在第一个表中获取所有ID,但在第二个表中没有所有值。如果id中的ownercars具有code表中与之关联的所有carcodes值,则根本不应该返回它们。

ownercars
id | code    |
1  | carA    |
1  | carB    |
1  | carC    |
2  | carD    |
3  | carD    |
3  | carE    |
3  | carF    |
4  | carD    |
4  | carE    |

carcodes
|code     |
| carD    |
| carE    |

此查询应返回id 1和2,因为id 1缺少carD和carE,而id 2缺少carE。

我已经尝试将代码为空的两个表都连接起来。

尽管在上面的示例中它仍然返回id 3,因为它发现carcodes表中不存在carF并仅返回它。但排除id 4,因为两者都存在。

我还尝试通过比较carcodes表中存在的ownercars和每个id的计数来进行计数,尽管这样做不起作用。

我已经考虑使用ANYALL,但没有成功。

SELECT oc.id
FROM ownercars as oc
LEFT JOIN carcodes as cc
on oc.code = cc.code
WHERE cc.code IS NULL

我希望能够基于其中存在所有代码的事实排除id 3。为此,需要对上一个查询进行哪些更改?

2 个答案:

答案 0 :(得分:0)

请尝试以下查询。

SELECT ID FROM carcodes
WHERE ID NOT IN (
    SELECT ID from ownercars 
    WHERE CARCODES in(SELECT cc.code FROM carcodes) 
    group by id having count(*) =2
)

答案 1 :(得分:0)

您可以使用group byhaving

SELECT oc.id
FROM ownercars oc LEFT JOIN
     carcodes cc
     ON oc.code = cc.code
GROUP BY oc.id
HAVING COUNT(DISTINCT cc.code) < (SELECT COUNT(*) FROM carcodes);

如果ownercars中没有重复项,则可以使用COUNT(cc.code)而不是COUNT(DISTINCT)