我已经创建了两个表并填充它们:
CREATE TABLE FirstTab (
id integer,
name VARCHAR(10) );
INSERT INTO FirstTab VALUES (5,'Pawan'), (6,'Sharlee'), (7,'Krish'),
(NULL,'Avtaar');
CREATE TABLE SecondTab (
id integer );
INSERT INTO SecondTab VALUES (5), (NULL);
我正在尝试从FirstTab中查找不在Second Tab中的记录(我猜像是一个自定义的外连接?)
但此查询不返回任何内容:
SELECT * FROM FirstTab AS ft WHERE ft.id NOT IN ( SELECT id FROM SecondTab );
它有什么问题吗?我应该得到2张唱片,而不是0张。
我在PgAdmin 4上使用Postgres
2条答案
按热度按时间7uhlpewt1#
除了@BillKarwin的评论解释了你的数据的行为和基本问题外,还有其他方式来表达你的逻辑,这些方式将按照你的意愿工作。
例如:
也就是说,假装Null等于Null是一个坏的主意。空值不相等是有原因的;空值不是一个值,而是缺少一个值。
您的查询返回了正确的结果。您希望查询返回两行的想法是错误的。
此外,强制它(如此答案)会引入OR条件,这会对性能造成重大影响,从而极大地削弱有效使用索引的能力。
不要那样做。只需使用id 0或-1或其他名称。然后,您可以确保值是唯一的,获得真正的相等,拥有更短、更干净的代码,并更有效地利用索引。
演示:https://dbfiddle.uk/x1YJ3kug
ljsrvy3e2#
第一条路
SELECT*FirstTab as ft WHERE ft.id NOT IN(SELECT ID FOR Second Tab WHERE ID不为空);
或
第二种方式(推荐)
从FirstTab.id<>Second Tab.id上的FirstTab内部联接Second Tab中选择FirstTab.*