PDA

View Full Version : [Outer Join] Non capisco una cosa ...


Matrixbob
27-10-2009, 10:50
Io ho sempre pensato che una outer join fosse l'unione di una left join (left outer join) e una right join (right outer join) ... non capisco l'ultima where (WHERE employee.DepartmentID IS NULL) della dichiarazione trovata su Wikipedia:
http://en.wikipedia.org/wiki/Join_(SQL)#Full_outer_join


SELECT *
FROM employee
LEFT JOIN department
ON employee.DepartmentID = department.DepartmentID
UNION
SELECT *
FROM employee
RIGHT JOIN department
ON employee.DepartmentID = department.DepartmentID
WHERE employee.DepartmentID IS NULL


Forse non gli trovo il significato perchè la UNION va letta in una certa maniera e non è la semplice unione di due tabelle d'estrazione?

Matrixbob
27-10-2009, 11:01
[PS]
Queste erano le tabelle iniziali:

http://img10.imageshack.us/img10/7321/immaginefb.jpg

Matrixbob
27-10-2009, 11:08
:boh: ... continuo a non capire, mi sento :fagiano:, anche perchè il risultato di left e right join sono:

http://img44.imageshack.us/img44/6521/immaginemm.jpg

Come outer join invece esce questo:

http://img16.imageshack.us/img16/4591/immaginepgb.jpg

wingman87
27-10-2009, 15:35
Stando a quanto dice il mio libro di bd ("Basi di dati - Modelli e linguaggi di interrogazione - Seconda Edizione", Atzeni-Ceri-Paraboschi-Torlone, McGraw-Hill, 2006) quella parte in neretto che hai preso da wikipedia è inutile (ridondante) perché la "union" elimina i duplicati. Se non lo facesse, come se stessimo facendo una "union all", allora sarebbe necessaria quella parte in neretto perché permette di selezionare solo righe che non appartengono anche al risultato della prima sotto-query.
Comunque la definizione di full outer join che c'è su wikipedia è corretta

Matrixbob
27-10-2009, 20:05
Comunque la definizione di full outer join che c'è su wikipedia è corretta.

Eh e io da li l'ho preso il codice è li che c'è quella riga spuria.
Sia in ENG che ITA trovo quella riga .... :boh:

wingman87
27-10-2009, 20:16
Beh, ti ho spiegato a cosa serve. Forse non tutti i dbms interpretano union allo stesso modo (nel senso che magari alcuni lo interpretano come "union all") e quindi per sicurezza hanno aggiunto quella riga che assicura l'assenza di duplicati.