where子句的区别 - in和in in

问题描述 投票:0回答:2

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

查询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个查询。两者都返回不同的结果集。有人可以帮我弄清楚两个查询的区别。

提前致谢!!

sql-server where where-clause
2个回答
0
投票

第一个查询 - 查找所有PRODUCT_CODEs(不符合标准)和VERSION_ID符合某些条件。然后,分别找到BUDGET表中与PRODUCT_CODEs匹配的所有行,并找到所有唯一的源。值得注意的是,这些行不受VERSION_ID约束。

第二个查询 - 找到所有SOURCEs(不符合标准)和VERSION_ID符合某些标准。这不会返回恰好具有相同SOURCE值但PRODCUT_CODE值不同的其他行的VERSION_ID值。

哪一个是正确的我不能说。如果我们有样本数据和预期结果,并且对您的目标有更多解释,那么这些查询当前都不符合您的期望。

(另外,请注意在DISTINCT查询中使用IN()充其量只会分散优化器,最坏的情况是悲观.IN()应该能够在识别单个匹配时立即返回。如果你运气不好,优化器实际上会做的工作是确保结果是唯一的,但不影响匹配是否存在的问题)


0
投票
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]%'
© www.soinside.com 2019 - 2024. All rights reserved.