1

我有两张桌子。一个包含 id 和值列表(一对多)。还有另一个表,其中包含用于匹配第一个表中的这些值的值列表。我想获取第一个表中没有第二个表中所有值的所有 id。如果一个idin具有表中与之关联的ownercars所有值,则根本不应该返回它们。codecarcodes

IE

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    |

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

我尝试加入代码为空的两个表。

尽管在上面的示例中这仍然返回id3,因为它看到表中不存在 carFcarcodes并简单地返回它。但不包括id4,因为两者都存在。

我还尝试通过比较表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。需要对上一个查询进行哪些更改才能执行此操作?

4

2 回答 2

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).

于 2019-07-05T11:48:18.710 回答
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
)
于 2019-07-05T02:48:51.263 回答