PDA

View Full Version : [SQL] dubbio query


lore11
13-07-2015, 10:26
ho un dubbio riguardo alle query.

avendo le tre tabelle:
Prenotazioni(CodCli, CodAl, Acconto, Camera)
Clienti(CodCli, Nome, Cognome, Eta)
Alberghi(CodAl, Città, Via)
devo fare una query che permette di visualizzare "Nome e Cognome di coloro che hanno prenotato la stanza 30".

io la farei così:
SELECT nome, cognome
FROM clienti
WHERE codcli IN (SELECT codicli FROM prenotazioni WHERE camera="30")

tuttavia, guardando esercizi svolti da altri studenti del mio corso, alcuni la farebbero così:
SELECT nome, cognome
FROM clienti, prenotazioni
WHERE clienti.codcli=prenotazioni.codcli AND camera="30";


sono giusti entrambi i metodi o solo uno dei due?? (perchè?)

grazie mille a tutti!!

Mex87
13-07-2015, 11:51
Ciao, spero di non scrivere vaccate nella risposta.

Le 2 query producono lo stesso risultato, ma la differenza sta che, usando l'operatore 'IN', la query annidata viene eseguita per ogni riga presente nella tabella clienti.

Mentre la seconda query è molto più efficiente perché alla fine usa un join tra le tabelle anche se non usa le parole chiavi per descrivere il Join.

EDIT: Credo di aver scritto una vaccata, forse tutto dipende dall'ottimizzazione che esegue il motore del Database

http://explainextended.com/2009/06/16/in-vs-join-vs-exists/

lore11
13-07-2015, 13:30
intanto grazie!
comunque anche io credo che siano giuste entrambe, al di là dell'efficienza della query stessa (a me interessa solo che sia giusta, l'efficienza -per ora- non è valutata).

spero che qualcuno mi possa confermare questo...

Gimli[2BV!2B]
13-07-2015, 20:35
Stesso risultato, personalmente considero il secondo "più corretto" perché annidare query solitamente non aiuta l'ottimizzazione, oltre a portare più facilmente a creare mostri...

Inoltre personalmente preferisco l'esplicitazione dell'inner join:SELECT nome, cognome
FROM clienti
INNER JOIN prenotazioni ON clienti.codcli = prenotazioni.codcli
WHERE prenotazioni.camera = "30";

xp2400
15-07-2015, 16:14
concordo, join esplicito.

l'annidamento comporta drammi nell'ottimizzazione.