PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come funziona EXCEPT in PostgreSQL

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