当前位置: 首页 > 知识库问答 >
问题:

NOT IN只返回两个表之间的左外连接delta?

沈栋
2023-03-14

所以我有两个表,并且有一个预期的行增量,但是这个增量不会返回,除非我使用左外连接。有人能帮我理解为什么查询1适用于这个用例,而查询2不适用:

--QUERY 1 - THE FIRST QUERY RETURNS THE EXPECTED DELTA BETWEEN FULLPROD and IMPORT_DOCUMENTS AS EXPECTED
SELECT FULLPROD_DOCID
FROM   (SELECT IMPORT_DOCUMENTS.DOCID AS Import_Documents_DocID,
               FULLPROD.DOCID         AS FullProd_DocID
        FROM   FULLPROD
               LEFT OUTER JOIN IMPORT_DOCUMENTS
                            ON FULLPROD.DOCID = IMPORT_DOCUMENTS.DOCID) SUBQUERY
WHERE  IMPORT_DOCUMENTS_DOCID IS NULL  

--QUERY 2 - WOULD EXPECT BELOW QUERY SHOULD RETURN THE SAME RESULT AS QUERY 1 BUT RETURNS NOTHING
SELECT DOCID
FROM   FULLPROD
WHERE  DOCID NOT IN (SELECT DOCID
                     FROM   IMPORT_DOCUMENTS)

共有3个答案

袁泓
2023-03-14

即使子查询中存在一个空值,NOT IN也不起作用。

不在下面这样的情况下将转换为:

WHERE  DOCID NOT IN (SELECT DOCID
                     FROM   IMPORT_DOCUMENTS)

WHERE DOCID != (SELECT DOCID FROM IMPORT_DOCUMENTS WHERE DOCID = 1)
AND
DOCID != (SELECT DOCID FROM IMPORT_DOCUMENTS WHERE DOCID = 2)
.
.

所以,如果我们得到一个DOCID为null的值,那么完整和条件将失败,并且不会返回任何行。

最好是像下面给出的那样选择不存在的条款:

SELECT DOCID
FROM   FULLPROD AS fp
WHERE  NOT EXISTS (
SELECT DOCID FROM IMPORT_DOCUMENTS AS IMD WHERE IMD.DOCID = fp.DOCID)

阅读更多关于不存在与不存在的信息

慕鸿波
2023-03-14

用此替换您的QUERY-2

SELECT DOCID
FROM FULLPROD F
WHERE NOT EXISTS ( SELECT DOCID
                    FROM  IMPORT_DOCUMENTS I
                    WHERE F.DOCID = I.DOCID
                    )
竺绍辉
2023-03-14

如果子查询中的任何值为NULL,则不返回任何行。

出于这个原因,对于这种逻辑,我总是建议不存在左连接/其中。他们的行为更直观(尽管不在中在技术上是正确的)。

 类似资料:
  • 我想返回每个行,并为和提供空值,如果它们没有。当我执行此查询时,我得到空结果。如果我使用而不是,我得到不正确的结果。如何过滤左连接,以便如果没有匹配,我仍然得到返回的p行与和的空值? 注:我在末尾添加了,仅用于测试目的。

  • 我有 2 张表 和。 特别提款权: 操作员: 我需要选择这个表并将结果插入到另一个表- 卡尔斯: 我需要选择两个表 和,并将结果(经过一些数据操作)插入到 表中。 我使用 JPA,但不明白该怎么做。我有一个想法来创建另一个像 这样的类并编写: 然后从 创建 .class或者还有另一种解决方案?

  • 问题内容: 我正在做左外部联接,但是我只能在第一个表上应用限制。ti是否也可以应用于第二个表? 这是我的代码: 这项工作(申请人拥有applicantName属性): 这些都不起作用(产品具有productName属性) criteria.add(Restrictions.eq(“ products.productName”,“ product1”)//产品:属性的名称criteria.add(R

  • LEFT OUTER JOIN 左外连接 [ ] 需求:查询所有分类,如果该分类下没有商品,则不显示该分类 [ ] 实现: SELECT `goods`.`id`, `goods`.`title`, `goods`.`price`, `goods`.`cate_id`, `cate`.`id`, `cate`, `cate.title` F

  • 问题内容: 我正在尝试使用以下查询获取每天打开的页面数。 我得到的输出是这样的: 问题是,在我的日表中,我有一列包含数字1到30来代表一个月中的日子。我进行了左外部连接,希望在天数列中显示所有天数! 但是我的查询正在这样做,为什么会这样呢? 谢谢大家的帮助。 问题答案: Nanne给出的答案解释了为什么您没有得到期望的结果(您的WHERE子句删除了行),但是却没有解决方法。 解决方案是将WHERE

  • 问题内容: 我已经看到在Python中实际上有两种(也许更多)串联列表的方法:一种方法是使用extend()方法: 另一个使用plus(+)运算符: 现在,我想知道:这两个选项中的哪一个是列表连接的“ pythonic”方式,并且两者之间有区别(我查看了Python的官方教程,但找不到有关此主题的任何信息)。 问题答案: 在字节码级别上的唯一区别是,该方式涉及函数调用,在Python中该函数比。调