postgres SQL中不存在与不存在的差异
这是我的桌子。postgres SQL中不存在与不存在的差异,sql,postgresql,Sql,Postgresql,这是我的桌子。 当我使用NOT IN执行下面的查询时,它给了我namal和Ann SELECT firstname FROM info.student_info WHERE firstname NOT IN (SELECT firstname FROM info.student_info WHERE lastname IS NULL) 但是当我使用notexists执行下面的查询时,它不会
当我使用NOT IN执行下面的查询时,它给了我namal和Ann
SELECT firstname
FROM info.student_info
WHERE firstname NOT IN (SELECT firstname
FROM info.student_info
WHERE lastname IS NULL)
但是当我使用notexists执行下面的查询时,它不会给我任何行
SELECT firstname
FROM info.student_info
WHERE NOT EXISTS (SELECT firstname
FROM info.student_info
WHERE lastname IS NULL)
为什么会这样?我研究了一些不存在和不存在的领域,但找不到答案 当值不在子查询返回的集合中时,
不在
为真。
当子查询不返回任何内容时,
NOT EXISTS
为真。您的NOT EXISTS
不区分名字,因此子选择将始终返回2行
要对NOT EXISTS执行相同的操作,您需要使用以下SQL:
SELECT firstname FROM info.student_info
WHERE NOT EXISTS
(SELECT firstname f2 FROM info.student_info
WHERE lastname IS NULL
AND f2 = firstname)
您没有在
不存在
查询中加入表,这就是为什么第二次查询没有得到任何结果
只有在子查询根本找不到记录的情况下,您的第二个查询才会返回结果
将查询更改为联接外部表的firstname列,然后可能会得到结果
SELECT firstname
FROM info.student_info
WHERE NOT EXISTS (SELECT b.firstname
FROM info.firstname b
WHERE b.lastname IS NULL
AND b.firstname = a.firstname
)
免责声明:未测试查询在第二种情况下,相关子查询与主查询不相关;如果不存在
lastname为NULL的任何行,则返回True。通常的答案是NULL
,但您的不在中已经过滤掉NULL
s@wildplasser准确地指出了区别。谢谢你,Jakub。这就是一切!非常感谢。老实说,我对存在的问题有一个误解。雅库布的回答启发了我。除此之外,这里的结果是相同的。