where 子句的区别 - in 和 not in

Difference in where clause - in and not in

以下两个查询有些不同。

查询 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_master和CVM中都没有产品代码的产品来源。我尝试以上 2 个查询。两者 return 不同的结果集。谁能帮我找出这两个查询的区别。

提前致谢!!

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]%'

第一个查询 - 查找所有 PRODUCT_CODE(不符合条件)且 VERSION_ID 符合特定条件。然后,分别在 BUDGET table 中找到与 PRODUCT_CODE 匹配的 all 行,并找到所有唯一来源。值得注意的是,这些行不受VERSION_ID约束。

第二个查询 - 查找所有 SOURCE 的(不在条件匹配中)并且 VERSION_ID 匹配特定条件。对于恰好具有相同 PRODCUT_CODE 值但不同 VERSION_ID 值的其他行,这不会 return SOURCE 值。

我不能说哪个是正确的。如果我们有示例数据和预期结果,以及对您的目标的更多解释,则这些查询目前可能都不符合您的预期。

(另外,请注意,在 IN() 查询中使用 DISTINCT 最好的情况是会分散优化器的注意力,最坏的情况是悲观情绪。IN() 应该能够 return 一旦它识别出一个匹配项。如果你不走运,优化器实际上会进行工作以确保结果是唯一的,但这不会影响 是否存在匹配项或不是)