如何从一个表中选择另一个表中不存在的所有记录?

问题描述 投票:0回答:1

我的表 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 是否有更快的查询?

sql postgresql set amazon-redshift
1个回答
0
投票

代码看起来正确吗?

不,它会从 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
        )
© www.soinside.com 2019 - 2024. All rights reserved.