|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Sep 2014
Messaggi: 22
|
[SQL] dubbio query
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ì: Codice:
SELECT nome, cognome FROM clienti WHERE codcli IN (SELECT codicli FROM prenotazioni WHERE camera="30") Codice:
SELECT nome, cognome FROM clienti, prenotazioni WHERE clienti.codcli=prenotazioni.codcli AND camera="30"; grazie mille a tutti!! |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Oct 2010
Messaggi: 52
|
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/1...oin-vs-exists/ Ultima modifica di Mex87 : 13-07-2015 alle 11:55. Motivo: Correzioni |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Sep 2014
Messaggi: 22
|
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... |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
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: Codice:
SELECT nome, cognome FROM clienti INNER JOIN prenotazioni ON clienti.codcli = prenotazioni.codcli WHERE prenotazioni.camera = "30";
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Mar 2004
Città: RoMaNoVeNeTo
Messaggi: 756
|
concordo, join esplicito.
l'annidamento comporta drammi nell'ottimizzazione.
__________________
Acer m5500 (Q6600,4MB) Sapphire Ati 3850, Logitech Performance MX, Tastiera Logitech G15, Epson bx 310 FN, QNAP 419p+, WDTVLIVE, Harmony One |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:06.