2017-06-20 1 views
0

In Oracle gibt die folgende MINUS-SQL-Anweisung Ergebnisse zurück, während die angeblich äquivalente OUTER JOIN-Anweisung keine zurückgibt.Oracle - MINUS-Operator mit anderen Ergebnissen als OUTER JOIN

Ergebnisse:

SELECT 
    /*+parallel (8)*/ 
    pd.item_id 
FROM [email protected]_LINK_PROD_ENV 
WHERE pd.valid_to='09.09.9999' 
MINUS 
SELECT 
    /*+parallel (8)*/ 
    it.item_id 
FROM [email protected]_LINK_TEST_ENV 
WHERE it.valid_to='09.09.9999' ; 

Keine Ergebnisse:

SELECT 
    /*+parallel (8)*/ 
    pd.item_id, 
    it.item_id 
FROM [email protected]_LINK_PROD_ENV 
LEFT OUTER JOIN [email protected]_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; 

, ohne die Daten zu wissen, was könnte der Grund sein?

+1

Wo Sie "schneiden" sagen, meinen Sie nicht "minus"? – philipxy

Antwort

1

In der ersten Abfrage ist es MINUS. Bedeutet, dass es alle item_id zeigt, die in DB_LINK_PROD_ENV mit valid_to = '09 .09.9999 'vorhanden sind, aber nicht in DB_LINK_TEST_ENV mit valid_to = '09 .09.9999' vorhanden sind.
In der zweiten ist es LEFT JOIN mit UND-Bedingung.

it.valid_to ='09.09.9999' 
AND pd.valid_to ='09.09.9999' 


So ist es möglich, dass es Aufzeichnungen in DB_LINK_PROD_ENV mit valid_to = '09 .09.9999' aber NO jeden Datensatz in DB_LINK_TEST_ENV mit valid_to = '09 .09.9999' .
Wenn Sie also in der ersten Abfrage MINUS ausführen, wird der Datensatz in DB_LINK_PROD_ENV angezeigt. Aber in der zweiten Abfrage kann die AND-Bedingung keinen Datensatz liefern.