Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgres SQL中不存在与不存在的差异_Sql_Postgresql - Fatal编程技术网

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。这就是一切!非常感谢。老实说,我对存在的问题有一个误解。雅库布的回答启发了我。除此之外,这里的结果是相同的。