代码之家  ›  专栏  ›  技术社区  ›  fishy101

where子句中的差异-in和not in

  •  0
  • fishy101  · 技术社区  · 6 年前

    以下两个查询中存在一些差异。

    问题1:

    select  distinct source from BUDGET where product_code in
                        (select distinct PRODUCT_CODE from BUDGET  where PRODUCT_CODE not in 
                                    (select distinct PRODUCT_CODE from PRODUCT_MASTER)
                                                                                and PRODUCT_CODE not in 
                                    (select distinct PRODUCT_CODE from CVM )
                                                                                and( VERSION_ID like '17%'
                                                                                or VERSION_ID like '18%')
                        )
    

    查询2:

    select  distinct SOURCE  from BUDGET where PRODUCT_CODE not in 
                                    (select distinct PRODUCT_CODE from PRODUCT_MASTER)
                                                                        and PRODUCT_CODE not in 
                                    (select distinct PRODUCT_CODE from CVM )
                                                                        and( VERSION_ID like '17%'
                                                                            or VERSION_ID like '18%')
    

    我想要product\u master和CVM中都不包含其产品代码的产品的来源。我尝试以上两个查询。两者都返回不同的结果集。有人能帮我找出这两个问题的区别吗。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Damien_The_Unbeliever    6 年前

    第一次查询-全部查找 PRODUCT_CODE 其中(不在标准匹配中)和 VERSION_ID 符合某些条件。然后,分别查找 全部的 中的行 BUDGET 与这些匹配的表 PRODUCT\u代码 并找到所有独特的来源。尤其是 这些 行不是 受限

    第二次查询-全部查找 SOURCE 其中(不在标准匹配中)和 版本\u ID 符合某些条件。这将不会返回 来源: 碰巧具有相同值的其他行的值 PRODCUT_CODE 值,但不同 版本\u ID 价值观

    我说不出哪一个是对的。如果我们有样本数据和预期结果,以及更多 解释 对于您的目标,可能是这两个查询当前都不符合您的期望。

    (另外,请注意 DISTINCT IN() 查询充其量只能分散优化器的注意力,而最坏的情况则是一种悲观情绪。 IN() 应该能够在识别出单个匹配项后立即返回。如果您运气不好,优化器实际上会确保结果是唯一的,但这不会影响 )

        2
  •  0
  •   Stanislav Kundii    6 年前
    SELECT DISTINCT source FROM  BUDGET WHERE  
    product_code IN -- NOT IN
    (
        SELECT PRODUCT_CODE  FROM PRODUCT_MASTER
        UNION ALL
        SELECT PRODUCT_CODE  FROM CVM 
    )
    AND VERSION_ID like '1[78]%'