我的表 A 包含列
key
和 date
,表 B 包含列 key
、date
和 flag
。我想选择 A 中键和日期与 B 匹配的所有记录,但忽略 B 中 flag
为 TRUE
的记录。
按键重复 - 每个日期一次。例如,
如果A是
钥匙 | 日期 |
---|---|
1 | 1/2020 |
1 | 2/2020 |
2 | 1/2020 |
2 | 2/2020 |
2 | 2020年3月 |
如果B是
钥匙 | 日期 | 旗帜 |
---|---|---|
1 | 1/2020 | 正确 |
1 | 2/2020 | 正确 |
2 | 1/2020 | 正确 |
2 | 2/2020 | 错误 |
2 | 2020年3月 | 错误 |
那么我希望结果是
钥匙 | 日期 |
---|---|
2 | 2/2020 |
2 | 2020年3月 |
这是我的想法:
SELECT key
FROM A
WHERE NOT EXISTS
(SELECT *
FROM B
WHERE A.date= B.date
AND B.flag = TRUE)
代码看起来正确吗?使用 NOT IN 或 EXCEPT 是否有更快的查询?
代码看起来正确吗?
不,它会从 A 中选择在 B 中根本没有对应条目的记录。
使用这个:
SELECT key, date
FROM a
INTERSECT
SELECT key, date
FROM b
WHERE flag IS DISTINCT FROM true -- handles NULL values as well
这假设您只需要 A 的密钥和日期,并且它们是唯一的。
如果您需要其他字段,或者(键,日期)在 A 中不唯一,请使用:
SELECT *
FROM a
WHERE (key, date) IN
(
SELECT key, date
FROM b
WHERE flag IS DISTINCT FROM true
)