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 一旦它识别出一个匹配项。如果你不走运,优化器实际上会进行工作以确保结果是唯一的,但这不会影响 是否存在匹配项或不是)
以下两个查询有些不同。
查询 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 一旦它识别出一个匹配项。如果你不走运,优化器实际上会进行工作以确保结果是唯一的,但这不会影响 是否存在匹配项或不是)