Oracle “(+)” Operatore

Sto controllando alcune vecchie istruzioni SQL allo scopo di documentarle e probabilmente migliorarle.

Il DBMS è Oracle

Non ho capito una frase che dicesse così:

select ... from a,b where a.id=b.id(+) 

Sono confuso dall’operatore (+) , e non sono riuscito a farlo in nessun forum … (anche la ricerca di + tra virgolette non ha funzionato).

Ad ogni modo, ho usato “Explain Plan” di SQLDeveloper e ho ricevuto un output che diceva che HASH JOIN, RIGHT OUTER , ecc.

Ci sarebbe qualche differenza se rimuovo l’operatore (+) alla fine della query? Il database deve soddisfare alcune condizioni (come avere alcuni indici, ecc.) Prima che (+) possa essere usato ?? Sarebbe di grande aiuto se riuscissi a fornirmi una semplice comprensione, o qualche buon link dove potrei leggere su questo.

Grazie!

Questa è la notazione specifica di Oracle per un JOIN OUTER, perché il formato ANSI-89 (utilizzando una virgola nella clausola FROM per separare i riferimenti di tabella) non standardizza i join OUTER.

La query verrebbe riscritta nella syntax ANSI-92 come:

  SELECT ... FROM a LEFT JOIN b ON b.id = a.id 

Questo link è abbastanza bravo a spiegare la differenza tra JOINs .


Va anche notato che, anche se il (+) funziona, Oracle consiglia di non utilizzarlo :

Oracle consiglia di utilizzare la syntax OUTER JOIN clausola FROM anziché l’operatore Oracle join. Le query di join esterno che utilizzano l’operatore di join Oracle (+) sono soggette alle seguenti regole e restrizioni, che non si applicano alla syntax OUTER JOIN clausola FROM :

L’operatore (+) indica un’unione esterna. Ciò significa che Oracle continuerà a restituire i record dall’altro lato del join anche quando non vi è alcuna corrispondenza. Ad esempio, se aeb sono emp e dept e puoi avere dipendenti non assegnati a un dipartimento, la seguente dichiarazione restituirà i dettagli di tutti i dipendenti, indipendentemente dal fatto che siano stati assegnati a un dipartimento.

 select * from emp, dept where emp.dept_id=dept.dept_id(+) 

Quindi, in breve, rimuovere il (+) può fare una differenza di significato, ma potresti non notare per un po ‘a seconda dei tuoi dati!

In Oracle, (+) indica la tabella “opzionale” nel JOIN. Quindi nella tua domanda,

 select a.id, b.id, a.col_2, b.col_2, ... from a,b where a.id=b.id(+) 

è un tavolo LEFT OUTER JOIN con tavolo ‘a’. Come la moderna query di join a sinistra. (restituirà tutti i dati della tabella ‘a’ senza perdere i dati sull’altro lato la tabella opzionale ‘b’ può perdere i suoi dati) inserisci la descrizione dell'immagine qui

 select a.id, b.id, a.col_2, b.col_2, ... from a Left join b ON a.id=b.id 

O

 select a.id, b.id, a.col_2, b.col_2, ... from a Left join b using(id) 

ora se rimuovi (+), allora sarà normale query di inner join,

 select a.id, b.id, a.col_2, b.col_2, ... from a,b where a.id=b.id 

inserisci la descrizione dell'immagine qui

restituirà solo tutti i dati in cui sia il valore ‘id’ delle tabelle ‘a’ e ‘b’ sia lo stesso, significa parte comune.

Extra: Se vuoi fare la tua domanda come Right join in formato vecchio o moderno allora apparirà come segue:

inserisci la descrizione dell'immagine qui

Vecchio:

 select a.id, b.id, a.col_2, b.col_2, ... from a,b where a.id(+)=b.id 

Moderno:

 select a.id, b.id, a.col_2, b.col_2, ... from a Right join b ON a.id=b.id 

O

 select a.id, b.id, a.col_2, b.col_2, ... from a Right join b using(id) 

Ref & help:

https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187

Left Outer Join usando + accedi Oracle 11g

https://www.w3schools.com/sql/sql_join_left.asp

In pratica, il simbolo + è posto direttamente nell’istruzione condizionale e sul lato della tabella opzionale (quella che può contenere valori vuoti o nulli all’interno del condizionale).