SQL JOIN

lunedì 6 agosto 2007 alle 06:19 | Pubblicato su Diario, SQL | 1 commento

oggi 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 for comments on this post. TrackBack URI

  1. […] 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 […]


Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Blog su WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: