在查找不在另一个表中的记录时,SQL查询不返回任何内容

brccelvz  于 2022-09-21  发布在  PostgreSQL
关注(0)|答案(2)|浏览(215)

我已经创建了两个表并填充它们:

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

7uhlpewt

7uhlpewt1#

除了@BillKarwin的评论解释了你的数据的行为和基本问题外,还有其他方式来表达你的逻辑,这些方式将按照你的意愿工作。

例如:

SELECT
  *
FROM
  FirstTab   F
WHERE
  NOT EXISTS (
    SELECT
      *
    FROM
      SecondTab   S
    WHERE
          S.id           = F.id
      OR (S.id IS NULL AND F.id IS NULL)
  )

也就是说,假装Null等于Null是一个的主意。空值不相等是有原因的;空值不是一个值,而是缺少一个值。

您的查询返回了正确的结果。您希望查询返回两行的想法是错误的。

此外,强制它(如此答案)会引入OR条件,这会对性能造成重大影响,从而极大地削弱有效使用索引的能力。

不要那样做。只需使用id 0或-1或其他名称。然后,您可以确保值是唯一的,获得真正的相等,拥有更短、更干净的代码,并更有效地利用索引。

演示:https://dbfiddle.uk/x1YJ3kug

ljsrvy3e

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

相关问题