SQL JOIN
Lunedì 6 Agosto 2007 at 06:19 | In Diario, SQL | 1 Commentoggi su cdos è apparsa una questione secondo me bizzarra su una LEFT JOIN molto particolare:
“
Hi,
create table a (num integer)
create table b (num integer)
insert into a values (1)
insert into b values (2)
select * from a left join b
on b.num = 123
where a.num = 1 and b.num is null
MySQL & Oracle 10i show the following result:
1 null
Oracle 9.2.0.1 shows:
Empty result set
Is this a bug of Oracle 9,2.0.1?
Any workaround?“
Io francamente appena vista la query sono rimasto perplesso perchè non ne riuscivo comprendere il significato. E’ vero che sulla teoria relazionale ho alcune lacune, però continuo a pensare che la query sia poco sensata. In ogni caso la domanda sul forum era un’altra ed io ho voluto dire la mia affermando che secondo me si trattava di una condizione “non definita” per cui non si poteva parlare di Bug.
In realtà qualcuno molto più preparato di me (almeno per quando riguarda al conoscenza degli standard ANSI/ISO SQL) ha riportato la definizione secondo tali standard della LEFT JOIN e di quella che è la semantica. Effettivamente come spiegato lo standard ANSI/ISO SQL pare non ponga alcuna restrizione sulla <seach condition> se si trova nella clausola ON della LEFT JOIN e da una definizione di quale deve essere il risultato che deve dare tale query, cioè nell’esempio precedente deve dare:
“
NUM NUM ---------- ---------- 1
“
Effettivamente è un esercizio didattico, io sono cascato nel tranello di non studiare la definizione ANSI/ISO SQL, non avendola neppura a portata di mano, essendo a disposizione solo a pagamento. Simili esempi quando vengono spiegate le OUTER JOIN è proprio difficile trovarli.
Sono rimasto ancora più confuso quando ho fatto ulteriori prove:
“
SQL> select * from a full outer join b on (1=1);
NUM NUM
---------- ----------
1 2
SQL> select * from a full outer join b on (1=0);
NUM NUM
---------- ----------
1
2
SQL> select * from a,b;
NUM NUM
---------- ----------
1 2
“
Fortunatamente un mio collega ha sulla propria scrivania il libro “Fundamentals of DATABASE SYSTEMS” Fourth Edition di Emasri e Navathe, un libro di testo universitario che dovrei possedere ed aver studiato bene anche io (ma su questo è meglio sorvolare). Dando una veloce occhiata a questo bel libro (un po’ pesantino devo dire) ne traggo, a mio beneficio, a pagina 237,l’affermazione che
“il concetto di tabelle “joinate” è stato incorporato nell’SQL per permettere agli utenti di specifi care una tabella risultante da una operazione di join nella clausola FROM di una query. Questo costrutto può essere più comprensibile rispetto al mescolare insieme tutte le condizioni di select e di join nella clausola WHERE.”
Aggiungo che comunque le JOIN esterne avrebbero richiesto estensioni quali il (+) di Oracle. A parte queste digressioni credo che l’unica risposta plausibile potrebbe darla CODD ed il suo storico articolo “A Relational Model of Data for Large Shared Data Banks” , chissà se lui ha mai pensato ad una outer join scritta in quel modo?
P.S. 03/03/2007
Il link all’articolo sopra pare non essere più valido, ad oggi funziana questo. Per il PDF con il testo completo, su google ho trovato questo link.
1 Commento »
RSS feed dei commenti a questo articolo. TrackBack URI
Lascia un commento
Blog su WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.


Read Translated version of this blog
[...] Pubblicato il Venerdì 8 Maggio 2009 di Cristian Cudizio Quasi due anni fa ho scritto un post sui Join in Oracle. Tre giorni fa Jonathan Lewis ha scritto sul suo blog un post intitolato “Dependent [...]
Pingback di SQL JOIN – aggiornamento « Oracle and other — Venerdì 8 Maggio 2009 #