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

Hvordan UNDTAGET virker i PostgreSQL

I PostgreSQL er EXCEPT operator returnerer rækker, der returneres af den venstre inputforespørgsel, som ikke returneres af den højre inputforespørgsel. Dette kan også kaldes forskellen mellem to forespørgsler.

Syntaks

Syntaksen ser sådan ud:

query1 EXCEPT [ALL] query2

Dubletter elimineres, medmindre EXCEPT ALL bruges.

Eksempel

Antag, at vi har følgende tabeller:

SELECT * FROM Teachers;
SELECT * FROM Students;

Resultat:

 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

Vi kan bruge EXCEPT operatør for at returnere lærere, der ikke også er studerende:

SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;

Resultat:

 teachername 
-------------
 Cathy
 Ben

Så vi får kun værdier, der vises i Teachers tabel, der ikke også vises i Students bord.

Som standard er EXCEPT operatør returnerer adskilte rækker. Så i vores eksempel returneres kun én række for Cathy , selvom der er to lærere med det navn.

Ovenstående eksempel svarer til følgende forespørgsel:

SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;

Resultat:

 teachername 
-------------
 Cathy
 Ben

Dette er det samme resultat, som vi fik, da der ikke var nogen eksplicit DISTINCT søgeord. Vi kan inkludere dubletter med ALL søgeord (mere om dette senere).

Vi kan få forskellige resultater, alt efter hvilken tabel der er til venstre og hvilken der er til højre. Her er et eksempel, der sætter Students tabel til venstre og Teachers til højre:

SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;

Resultat:

 studentname 
-------------
 Faye
 Jet
 Spike
 Ein

Denne gang får vi elever, der ikke også er lærere.

Medtag dubletter

Som standard er EXCEPT operatør anvender implicit en DISTINCT operation. Med andre ord returnerer det kun distinkte værdier som standard.

Vi kan inkludere ALL søgeord for at inkludere dubletter i vores resultat:

SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;

Resultat:

 teachername 
-------------
 Cathy
 Cathy
 Bill
 Ben

Denne gang fik vi fire rækker i stedet for de to, som vi fik i vores første eksempel.

Vi kan se, at begge Cathys blev returneret i stedet for blot én som i vores første eksempel.

Hvad angår Bill? Der er to regninger i Teachers bord, men kun én returneres her. Det er sandsynligvis, fordi der er én regning i Students tabel, hvilket ville udelukke et af lovforslagene fra vores resultater.

Et alternativ

Det er muligt at få det samme resultat uden at bruge EXCEPT operatør. For eksempel kunne vi omskrive vores første eksempel til dette:

SELECT 
    DISTINCT TeacherName
FROM Teachers t 
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);

Resultat:

 teachername 
-------------
 Cathy
 Ben

  1. ORA-21700:objekt eksisterer ikke eller er markeret til sletning for Associative Array som inputparameter kaldet fra ODP.NET

  2. 3 måder at slette duplikerede rækker i SQL Server, mens du ignorerer den primære nøgle

  3. PDO flere forespørgsler

  4. Er vi klar til Nordic PGDay?