2013-06-14 32 views
7

Ecco una domanda che mi ha sconvolto per alcuni giorni, e ho cercato e cercato ma non ho trovato nessuna risposta convincente!2 join esterni sullo stesso tavolo?

Domanda semplice, perché è limitato ad avere 2 Outer Join in SQL, sulla stessa tabella anche con colonne diverse in uso, controllare le query di seguito per una migliore comprensione. Posso anche superarli usando sub query annidate o join ANSI, ma poi perché è addirittura limitato in primo luogo usando l'operatore (+)!

In questa domanda mi riferisco a l'errore: "ORA-01417: un tavolo può essere esterna uniti al massimo un altro tavolo"

Quello che voglio porre è:

Perchè questo è consentito:

select * from 
a, b, c 
where a.a1 = b.b1 
and a.a2 = c.c1 

E perché questo non è consentito:

select * from 
a, b, c 
where a.a1(+) = b.b1 
and a.a2(+) = c.c1 

si prega di lasciare ANSI e subquery nidificati solo

+6

Puoi fornire un esempio di ciò che stai cercando di fare? Dovresti essere in grado di unirti ('inner' o' outer') alla stessa tabella quante volte è necessario ... – sgeddes

+2

Come hai detto @sgeddes, molto probabilmente sei confuso. Non c'è limite "2 Outer Joins" su Oracle – Lamak

+2

Ti stai riferendo a 'ORA-01417: una tabella può essere esterna unita a un massimo di un'altra tabella? –

risposta

10

La restrizione è descritta nella documentazione di Oracle: Outer Joins

Oracle consiglia di utilizzare la clausola FROM outer join sintassi piuttosto che l'Oracle unirsi dell'operatore. Outer join query che utilizzano l'Oracle uniscono operatore (+) sono soggetti ai seguenti regole e le restrizioni, che non si applicano alla clausola FROM outer join sintassi:

...

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 è possibile applicare l'operatore (+) alle colonne di B nella condizione di join per A e B e la condizione di join per B e C. Fare riferimento a SELECT per la sintassi per un join esterno.

che in pratica significa (descritto nella sintassi ANSI/ISO), che non si può avere con il vecchio (+) sintassi di ciò che è perfettamente valido in ANSI/ISO:

--- Query 1 --- 
    a 
RIGHT JOIN b 
    ON a.x = b.x 
RIGHT JOIN c 
    ON a.y = c.y 

o:

--- Query 1b --- 
    c 
LEFT JOIN 
    b LEFT JOIN a 
     ON a.x = b.x 
    ON a.y = c.y 

Questa è solo una delle molte restrizioni della vecchia sintassi Oracle.


Per quanto riguarda i motivi di questa limitazione, possono essere i dettagli dell'implementazione e/o l'ambiguità di tali join. Mentre i due si unisce sopra sono al 100% equivalenti, quanto segue non è equivalente a quanto sopra due:

--- Query 2 --- 
    a 
RIGHT JOIN c 
    ON a.y = c.y 
RIGHT JOIN b 
    ON a.x = b.x 

vedere il test in SQL-Fiddle. Quindi sorge la domanda. Come deve essere interpretato il join proprietario, come query 1 o 2?

FROM a, b, c 
WHERE a.y (+) = c.y 
    AND a.x (+) = b.x 

v'è alcuna restrizione se una tabella appare sul lato sinistro della (2 o più) outer join. Questi sono perfettamente validi, anche con la vecchia sintassi:

FROM a 
    LEFT JOIN b ON a.x = b.x 
  LEFT JOIN c ON a.y = c.y 
    ... 
    LEFT JOIN z ON a.q = z.q 

FROM a, b, ..., z 
WHERE a.x = b.x (+) 
  AND a.y = c.y (+) 
    ... 
    AND a.q = z.q (+) 
+0

Bella spiegazione. –

+0

Questa restrizione sembra essere stata rilassata in 12c –

+0

@shonkylinuxuser Collegamento a questo? Penserei che rimuoverebbero il supporto per la vecchia sintassi, non lo migliorerebbero. –

Problemi correlati