Sql Postgres中NOT-IN从句的使用困惑
我使用以下查询在Amazon Redshift上获得零结果 问题1: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
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
中有任何空值吗?你让我看到了一些我一无所知的东西。谢谢。在遇到这个问题之前,我在写的几乎每个查询中都使用了而不是。现在我知道了,多亏了你:)。