Oracle - 结果与 OUTER JOIN 不同的 MINUS 运算符
Oracle - MINUS-operator with different results than OUTER JOIN
在 Oracle 中,以下 MINUS SQL 语句 returns 结果,而据称等效的 OUTER JOIN 语句没有 return 任何结果。
结果:
SELECT
/*+parallel (8)*/
pd.item_id
FROM MY_TABLE@DB_LINK_PROD_ENV
WHERE pd.valid_to='09.09.9999'
MINUS
SELECT
/*+parallel (8)*/
it.item_id
FROM MY_TABLE@DB_LINK_TEST_ENV
WHERE it.valid_to='09.09.9999' ;
没有结果:
SELECT
/*+parallel (8)*/
pd.item_id,
it.item_id
FROM MY_TABLE@DB_LINK_PROD_ENV
LEFT OUTER JOIN MY_TABLE@DB_LINK_TEST_ENV
ON pd.item_id = it.item_id
WHERE it.valid_to ='09.09.9999'
AND pd.valid_to ='09.09.9999'
AND it.item_id IS NULL;
在不知道数据的情况下,可能是什么原因?
在第一个查询中是 MINUS
。意味着它将显示 DB_LINK_PROD_ENV 中存在的所有 item_id
具有 valid_to='09.09.9999' 但不存在于具有 valid_to='09.09.9999' 的 DB_LINK_TEST_ENV 中.
第二个是 LEFT JOIN
AND 条件。
it.valid_to ='09.09.9999'
AND pd.valid_to ='09.09.9999'
所以有可能 DB_LINK_PROD_ENV 中的记录具有 valid_to='09.09.9999' 但 NO
DB_LINK_TEST_ENV 中的任何记录valid_to='09.09.9999'。
因此,当您在第一个查询中执行 MINUS 时,它将显示 DB_LINK_PROD_ENV 中存在的记录。但是在第二个查询中,AND 条件将无法为您提供任何记录。
在 Oracle 中,以下 MINUS SQL 语句 returns 结果,而据称等效的 OUTER JOIN 语句没有 return 任何结果。
结果:
SELECT
/*+parallel (8)*/
pd.item_id
FROM MY_TABLE@DB_LINK_PROD_ENV
WHERE pd.valid_to='09.09.9999'
MINUS
SELECT
/*+parallel (8)*/
it.item_id
FROM MY_TABLE@DB_LINK_TEST_ENV
WHERE it.valid_to='09.09.9999' ;
没有结果:
SELECT
/*+parallel (8)*/
pd.item_id,
it.item_id
FROM MY_TABLE@DB_LINK_PROD_ENV
LEFT OUTER JOIN MY_TABLE@DB_LINK_TEST_ENV
ON pd.item_id = it.item_id
WHERE it.valid_to ='09.09.9999'
AND pd.valid_to ='09.09.9999'
AND it.item_id IS NULL;
在不知道数据的情况下,可能是什么原因?
在第一个查询中是 MINUS
。意味着它将显示 DB_LINK_PROD_ENV 中存在的所有 item_id
具有 valid_to='09.09.9999' 但不存在于具有 valid_to='09.09.9999' 的 DB_LINK_TEST_ENV 中.
第二个是 LEFT JOIN
AND 条件。
it.valid_to ='09.09.9999'
AND pd.valid_to ='09.09.9999'
所以有可能 DB_LINK_PROD_ENV 中的记录具有 valid_to='09.09.9999' 但 NO
DB_LINK_TEST_ENV 中的任何记录valid_to='09.09.9999'。
因此,当您在第一个查询中执行 MINUS 时,它将显示 DB_LINK_PROD_ENV 中存在的记录。但是在第二个查询中,AND 条件将无法为您提供任何记录。