PDA

Visualizza versione completa : [SQL] Cosa cambia tra On e Where ??


Fast-M
01-07-2006, 17.10.05
Salve a tutti, programmo da parecchio tempo, ma non ho mai avuto chiara la differenza di risultato tra:

SELECT * FROM TABELLA1 INNER JOIN TABELLA2
ON(TABELLA1.CAMPO1=TABELLA2.CAMPO2)
WHERE ...CONDIZIONE;

e:

SELECT * FROM TABELLA1,TABELLA2
WHERE TABELLA1.CAMPO1=TABELLA2.CAMPO2 AND
...CONDIZIONE;

Cioè non sono entrambi due inner join che usano l'uguaglianza tra i campi chiave delle due tabelle ed un'altra condizione di vario tipo per instaurare il join?

Quindi in genere cosa cambia da un punto di vista del resultset ottenuto eseguendo la query se anzicchè usare INNER JOIN ... ON, si usa soltanto la virgola e poi WHERE ??

Grazie in anticipo!

Semi.genius
01-07-2006, 19.02.56
Cambia soltanto la definizione.

SELECT * FROM TABELLA1,TABELLA2
WHERE TABELLA1.CAMPO1=TABELLA2.CAMPO2 AND
...CONDIZIONE;

si dice Join naturale perché tu specifichi il collegamento tra i due campi come una condizione..la tabella derivata su dove calcolare i dati viene creata automaticamente

SELECT * FROM TABELLA1,TABELLA2
WHERE TABELLA1.CAMPO1=TABELLA2.CAMPO2 AND
...CONDIZIONE;

si chiama Equi-Join perché tramite l'INNER JOIN crei una tabella derivata formata dagli elementi dove le due chiavi sono uguali...INNER JOIN è la forma generale usata per collegare queste tabelle ma quando si hanno due tabelle sole, è possibile usare il Join Naturale. Se si superano le due tabelle, non è più consigliabile il Join naturale e da lo stesso risultato.

(Ps. almeno è quello che mi hanno insegnato a scuola:p)

Fast-M
02-07-2006, 03.55.20
Grazie per la tua risposta in cui praticamente confermi quello che da parecchio tempo già pensavo perchè era continuamente confermato dai risultati che avevo.
Cioè che da un punto di vista del resultset che si ottiene usando INNER JOIN ... ON, oppure TABELLA1,TABELLA2...WHERE, non cambia assolutamente nulla se non la forma con la quale si esprime appunto il join tra le due tabelle.
Ma dal punto di vista delle prestazioni cambia qualcosa per caso?

Dav82
02-07-2006, 04.11.51
Ma dal punto di vista delle prestazioni cambia qualcosa per caso?
Sempre join sono, e come dice Semi.genius sono semplicemente due sintassi differenti per esprimere le stesse operazioni, quindi a occhio direi che non cambia nulla :)
In sostanza, per la seconda forma, analizzando le condizioni poste nella where si può effettuare - e a occhio direi abbastanza facilmente - una traduzione nella prima forma... un mapping 1-1 insomma.

Per quanto riguarda le prestazioni cmq il tutto dipende da quanto è "furbo" il traduttore/ottimizzatore di query del DBMS che usi... penso cmq che un qualsiasi traduttore SQL -> algebra relazionale (o rappresentazione interna usata) tratti le due espressioni allo stesso modo :)
E anche nel caso non le tratti allo stesso modo, non è detto che il risultato sia differente: infatti le operazioni di ottimizzazione della query (tenendo anche presenti ulteriori istruzioni di condizione, ordinamento etc) potrebbero portare alla stessa espressione finale pur partendo da espressioni iniziali differenti.


Il tutto supportato solo e unicamente dalla teoria :D In pratica non ho mai provato a valutare, su diversi DBMS, le prestazioni di query simili scritte in queste due forme differenti :)


(e il tutto con beneficio d'inventario... per l'ora tarda :D)

The_Prof
02-07-2006, 11.47.59
Attualmente INNER e OUTER join vengono usate per query SQL con esigenze specifiche e complicate
Per non complicarsi troppo la vita è meglio scrivere (DB2 IBM)

Select *
from tabella1 a , tabella2 b
where a.campo1 = b.campo2
;

Riguardo alle prestazioni è fondamentale il numero delle righe delle tabelle.

Esistono dei tools specifici che sono in grado, analizzando la query e le tabelle interessate, di fornire suggerimenti per modifiche tabellari, inserimenti di indici, o modifiche alla query.

Ciao :)

Robcrash
29-09-2006, 13.44.08
Scusate l'intrusione , sono appena entrato nel forum .
Qualcuno sa dirmi se posso con una query risolvere il seguente problema?

ho una tabella Azienda formata da i seguenti campi:

cod_azn varchar2(7)
des_azn VARCHAR2(250)
per_azn NUMBER(5)
RESP_LEG NUMBER(5)
RESP_OP NUMBER(5)

select * from azienda

cod_azn des_azn per_azn RESP_LEG RESP_OP
ca ufficio_bilancio 12 1001 1001
ca ufficio_bilancio 13 1001 1001
ca ufficio_bilancio 14 1001 1001
ca ufficio_bilancio 15 1001 1001
ca ufficio_bilancio 16 1001 1001

c'è la possibilità di tirar fuori dei dati in questo modo?

cod_azn des_azn per_azn RESP_LEG RESP_OP
ca ufficio_bilancio 12 1001 1001
ca 13
ca 14
ca 15
ca 16

cioè avere uno spool
che mi dia tutti i codici uffici (cod_azn ) ma una volta sola la descrizione ufficio(des_azn) e tutte le persone(per_azn)
ho provato con delle union ma non va
. vorrei evitare di far un programma

grazie

The_Prof
29-09-2006, 16.51.04
Scusate l'intrusione , sono appena entrato nel forum .
Qualcuno sa dirmi se posso con una query risolvere il seguente problema?
ho una tabella Azienda formata da i seguenti campi:
cod_azn varchar2(7)
des_azn VARCHAR2(250)
per_azn NUMBER(5)
RESP_LEG NUMBER(5)
RESP_OP NUMBER(5)
select * from azienda
cod_azn des_azn per_azn RESP_LEG RESP_OP
ca ufficio_bilancio 12 1001 1001
ca ufficio_bilancio 13 1001 1001
ca ufficio_bilancio 14 1001 1001
ca ufficio_bilancio 15 1001 1001
ca ufficio_bilancio 16 1001 1001
c'è la possibilità di tirar fuori dei dati in questo modo?
cod_azn des_azn per_azn RESP_LEG RESP_OP
ca ufficio_bilancio 12 1001 1001
ca 13
ca 14
ca 15
ca 16
cioè avere uno spool
che mi dia tutti i codici uffici (cod_azn ) ma una volta sola la descrizione ufficio(des_azn) e tutte le persone(per_azn)
ho provato con delle union ma non va
. vorrei evitare di far un programma
grazie

Spero che il risultato della prima query sia solo un esempio, altrimenti qualcosa non va nella base dati.

Puoi provare a scrivere

Select distinct(cod_azn) , ecc.
per tutti i campi che vuoi compaiano una sola volta.

Ciao :)