In SQLite, il EXCEPT
può essere utilizzato per creare un composto SELECT
istruzione che restituisce il sottoinsieme di righe restituite dal SELECT
sinistro che non vengono restituiti dal diritto SELECT
.
Esempio
Supponiamo di avere le seguenti tabelle:
SELECT * FROM Teachers;
SELECT * FROM Students;
Risultato:
TeacherId TeacherName --------- ----------- 1 Warren 2 Ben 3 Cathy 4 Cathy 5 Bill 6 Bill StudentId StudentName --------- ----------- 1 Faye 2 Jet 3 Spike 4 Ein 5 Warren 6 Bill
Possiamo usare EXCEPT
operatore per restituire gli insegnanti che non sono anche studenti:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;
Risultato:
TeacherName ----------- Ben Cathy
Quindi otteniamo solo i valori che appaiono in Teachers
tabella che non compare anche in Students
tavolo.
Possiamo ottenere risultati diversi, a seconda di quale tabella si trova a sinistra e quale a destra. Ecco un esempio che mette gli Students
tabella a sinistra e Teachers
a destra:
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;
Risultato:
StudentName ----------- Ein Faye Jet Spike
Questa volta abbiamo studenti che non sono anche insegnanti.
EXCEPT
di SQLite l'operatore restituisce solo righe distinte. Quindi nel nostro esempio, viene restituita solo una riga per Cathy
, anche se ci sono due insegnanti con quel nome.
Alcuni altri RDBMS ci consentono di includere duplicati nel risultato accettando un ALL
opzionale parola chiave con il loro EXCEPT
operatore, ma SQLite no (almeno, non al momento della scrittura). Sentiti libero di controllare la documentazione di SQLite nel caso qualcosa cambi.
Un'alternativa
È possibile ottenere lo stesso risultato senza utilizzare il EXCEPT
operatore. Ad esempio, potremmo riscrivere il nostro primo esempio in questo:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
Risultato:
TeacherName ----------- Ben Cathy