Oracle - MINUS-operator与OUTER JOIN的结果不同

时间:2017-06-20 08:59:06

标签: sql outer-join

在Oracle中,以下MINUS SQL语句返回结果,而所谓的等效OUTER JOIN语句不返回任何结果。

结果:

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;

在不知道数据的情况下,可能是什么原因?

1 个答案:

答案 0 :(得分:1)

在第一个查询中,它是MINUS。表示它会显示DB_LINK_PROD_ENV中存在的所有item_id,其中包含valid_to =' 09.09.9999'但在DB_LINK_TEST_ENV中没有出现,其中包含valid_to =' 09.09.9999'。
在第二个中,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条件将无法给你任何记录。