Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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
Sql Postgres中NOT-IN从句的使用困惑_Sql_Postgresql_Null_Amazon Redshift - Fatal编程技术网

Sql Postgres中NOT-IN从句的使用困惑

Sql Postgres中NOT-IN从句的使用困惑,sql,postgresql,null,amazon-redshift,Sql,Postgresql,Null,Amazon Redshift,我使用以下查询在Amazon Redshift上获得零结果 问题1: SELECT id FROM flx2.groups WHERE id NOT IN (SELECT groupid FROM flx2.lmsprovidergroups) 现在,如果我将同一查询稍微修改为: 问题2: SELECT id FROM flx2.groups WHERE id NOT IN (SELECT id FROM flx2.groups

我使用以下查询在Amazon Redshift上获得零结果

问题1:

SELECT id
FROM flx2.groups
WHERE id NOT IN (SELECT groupid FROM flx2.lmsprovidergroups)
现在,如果我将同一查询稍微修改为:

问题2:

SELECT id
FROM flx2.groups
WHERE id NOT IN (SELECT id
                 FROM flx2.groups
                 WHERE id IN (SELECT groupid FROM flx2.lmsprovidergroups))
我正试图从
lmsprovidergroups
中排除
id
,以从
组中获取子集。为什么我必须先包含它(如查询2中的内部查询),然后再排除它

就我而言,查询1与查询2完全相同。

为什么查询2起作用而查询1不起作用?

如果
不在
条件的子查询返回至少一个
NULL
值,则
不在
的计算结果为“未知”,这将导致根本没有匹配的行

您需要从子查询中删除
null
值:

SELECT id
FROM flx2.groups
WHERE id NOT IN (SELECT groupid 
                 FROM flx2.lmsprovidergroups
                 WHERE groupid is not null)
第二个查询基本上做了相同的事情:它从子查询中删除
null
值(假设
groups.id
不包含任何null)

不在(选择…)
几乎总是一个错误的选择。它不仅表现出“令人惊讶”的行为,每一侧都有空值(如果您不熟悉逻辑),而且通常比
不存在的高级替代方案慢:

SELECT id
FROM   flx2.groups g
WHERE  NOT EXISTS (SELECT 1 FROM flx2.lmsprovidergroups
                   WHERE  groupid = g.id);
还有其他标准技术:


使用
左连接将更容易。这两个查询是完全不同的。@JakubKania:您能解释一下这些查询是如何不同的吗?我知道我想出了它们,但我看不出它们有什么不同。我的意思是,当然,一个产生结果,另一个没有,它们必须是不同的。但是如何,为什么?在
flx2.groups.id
中有任何
null
?顺便说一下:对于
in
NOT in
子句,子选择中的
distinct
是useless@a_horse_with_no_name:我同意在这种情况下,
distinct
是无用的。
flx2.groups.id
中没有
nulls
flx2.lmsprovidergroups.groupid
中有任何空值吗?你让我看到了一些我一无所知的东西。谢谢。在遇到这个问题之前,我在写的几乎每个查询中都使用了
而不是
。现在我知道了,多亏了你:)。