In PostgreSQL, il EXCEPT
l'operatore restituisce le righe restituite dalla query di input di sinistra che non vengono restituite dalla query di input di destra. Questa può anche essere definita differenza tra due query.
Sintassi
La sintassi è questa:
query1 EXCEPT [ALL] query2
I duplicati vengono eliminati a meno che EXCEPT ALL
viene utilizzato.
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 ------------- Cathy Ben
Quindi otteniamo solo i valori che appaiono in Teachers
tabella che non compare anche in Students
tavolo.
Per impostazione predefinita, EXCEPT
l'operatore restituisce righe distinte. Quindi nel nostro esempio, viene restituita solo una riga per Cathy
, anche se ci sono due insegnanti con quel nome.
L'esempio sopra è l'equivalente della seguente query:
SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;
Risultato:
teachername ------------- Cathy Ben
Questo è lo stesso risultato che abbiamo ottenuto quando non c'era un DISTINCT
esplicito parola chiave. Possiamo includere duplicati con ALL
parola chiave (ne parleremo più avanti).
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 ------------- Faye Jet Spike Ein
Questa volta abbiamo studenti che non sono anche insegnanti.
Includi duplicati
Per impostazione predefinita, EXCEPT
l'operatore applica implicitamente un DISTINCT
operazione. In altre parole, restituisce solo valori distinti per impostazione predefinita.
Possiamo includere il ALL
parola chiave per includere i duplicati nel nostro risultato:
SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;
Risultato:
teachername ------------- Cathy Cathy Bill Ben
Questa volta abbiamo ottenuto quattro righe, invece delle due che abbiamo ottenuto nel nostro primo esempio.
Possiamo vedere che entrambi i Cathy sono stati restituiti invece di uno solo come nel nostro primo esempio.
Quanto a Bill? Ci sono due Bill in Teachers
tabella, ma qui ne viene restituito solo uno. Probabilmente perché c'è un disegno di legge in Students
tabella, che escluderebbe uno dei Bill dai nostri risultati.
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 ------------- Cathy Ben