以下两个查询存在一些差异。
查询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个查询。两者都返回不同的结果集。有人可以帮我弄清楚两个查询的区别。
提前致谢!!
第一个查询 - 查找所有PRODUCT_CODE
s(不符合标准)和VERSION_ID
符合某些条件。然后,分别找到BUDGET
表中与PRODUCT_CODE
s匹配的所有行,并找到所有唯一的源。值得注意的是,这些行不受VERSION_ID
约束。
第二个查询 - 找到所有SOURCE
s(不符合标准)和VERSION_ID
符合某些标准。这不会返回恰好具有相同SOURCE
值但PRODCUT_CODE
值不同的其他行的VERSION_ID
值。
哪一个是正确的我不能说。如果我们有样本数据和预期结果,并且对您的目标有更多解释,那么这些查询当前都不符合您的期望。
(另外,请注意在DISTINCT
查询中使用IN()
充其量只会分散优化器,最坏的情况是悲观.IN()
应该能够在识别单个匹配时立即返回。如果你运气不好,优化器实际上会做的工作是确保结果是唯一的,但不影响匹配是否存在的问题)
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]%'