我有两个桌子。一个带有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的计数来进行计数,尽管这样做不起作用。
我已经考虑使用ANY
或ALL
,但没有成功。
SELECT oc.id
FROM ownercars as oc
LEFT JOIN carcodes as cc
on oc.code = cc.code
WHERE cc.code IS NULL
我希望能够基于其中存在所有代码的事实排除id
3。为此,需要对上一个查询进行哪些更改?
答案 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 by
和having
:
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)
。