Oracle
 sql >> Database >  >> RDS >> Oracle

Differenza tra la notazione più (+) di Oracle e la notazione ansi JOIN?

AFAIK, il (+) la notazione è presente solo per la compatibilità con le versioni precedenti perché Oracle l'ha lanciata prima che fosse messo in atto lo standard ANSI per i join. È specifico di Oracle e dovresti evitare di usarlo nel nuovo codice quando è disponibile una versione equivalente conforme agli standard.

Sembra che ci siano differenze tra i due e il (+) la notazione ha restrizioni che la sintassi del join ANSI non ha. Oracle stessa consiglia di non utilizzare il (+) notazione.Descrizione completa qui in Oracle® Database SQL Language Reference11g Release 1 (11.1):

Oracle consiglia di utilizzare FROM clausola OUTER JOIN sintassi anziché l'operatore di join Oracle. Query di join esterno che utilizzano l'operatore di join Oracle (+) sono soggetti alle seguenti regole e restrizioni, che non si applicano al FROM clausola OUTER JOIN sintassi:

  • Non puoi specificare il (+) operatore in un blocco di query che contiene anche FROM sintassi di unione della clausola.
  • Il (+) l'operatore può apparire solo in WHERE clausola o, nel contesto della correlazione a sinistra (quando si specifica la TABLE clausola) nel FROM clausola e può essere applicato solo a una colonna di una tabella o di una vista.
  • Se A e B sono uniti da più condizioni di unione, è necessario utilizzare il (+) operatore in tutte queste condizioni. In caso contrario, Oracle Database restituirà solo le righe risultanti da un semplice join, ma senza un avviso o un errore per avvisarti che non hai i risultati di un outer join.
  • Il (+) operatore non produce un outer join se specifichi una tabella nella query esterna e l'altra tabella in una query interna.
  • Non puoi usare il (+) operatore per unire esternamente una tabella a se stessa, sebbene i self join siano validi.

Ad esempio, la seguente istruzione non è valida:

SELECT employee_id, manager_id
FROM employees
WHERE employees.manager_id(+) = employees.employee_id;

Tuttavia, è valido il seguente self join:

SELECT e1.employee_id, e1.manager_id, e2.employee_id
FROM employees e1, employees e2
WHERE e1.manager_id(+) = e2.employee_id;
  • Il (+) L'operatore può essere applicato solo a una colonna, non a un'espressione arbitraria. Tuttavia, un'espressione arbitraria può contenere una o più colonne contrassegnate da (+) operatore.
  • Un WHERE condizione contenente il (+) l'operatore non può essere combinato con un'altra condizione utilizzando OR operatore logico.
  • Un WHERE condizione non può utilizzare il IN condizione di confronto per confrontare una colonna contrassegnata con (+) operatore con un'espressione.

Se il WHERE La clausola contiene una condizione che confronta una colonna della tabella B con una costante, quindi il (+) l'operatore deve essere applicato alla colonna in modo che Oracle restituisca le righe dalla tabella A per le quali ha generato valori null per questa colonna. Altrimenti Oracle restituisce solo i risultati di un semplice join.

In una query che esegue join esterni di più di due coppie di tabelle, una singola tabella può essere la tabella generata da null solo per un'altra tabella. Per questo motivo, non puoi applicare il (+) operatore alle colonne di B nella condizione di unione per A e B e nella condizione di unione per B e C. Fare riferimento a SELECT per la sintassi di un outer join.