sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur EXCEPT fungerar i PostgreSQL

I PostgreSQL, EXCEPT operatorn returnerar rader som returneras av den vänstra inmatningsfrågan som inte returneras av den högra inmatningsfrågan. Detta kan också kallas skillnaden mellan två frågor.

Syntax

Syntaxen ser ut så här:

query1 EXCEPT [ALL] query2

Dubbletter elimineras om inte EXCEPT ALL används.

Exempel

Anta att vi har följande 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 använda EXCEPT operatör för att returnera lärare som inte också är elever:

SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;

Resultat:

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

Så vi får bara värden som visas i Teachers tabell som inte också visas i Students tabell.

Som standard är EXCEPT operatorn returnerar distinkta rader. Så i vårt exempel returneras bara en rad för Cathy , även om det finns två lärare med det namnet.

Exemplet ovan motsvarar följande fråga:

SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;

Resultat:

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

Detta är samma resultat som vi fick när det inte fanns någon explicit DISTINCT nyckelord. Vi kan inkludera dubbletter med ALL nyckelord (mer om detta senare).

Vi kan få olika resultat, beroende på vilken tabell som är till vänster och vilken som är till höger. Här är ett exempel som sätter Students tabellen till vänster och Teachers till höger:

SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;

Resultat:

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

Den här gången får vi elever som inte också är lärare.

Inkludera dubbletter

Som standard är EXCEPT operatorn tillämpar implicit en DISTINCT drift. Med andra ord returnerar den endast distinkta värden som standard.

Vi kan inkludera ALL sökord för att inkludera dubbletter i vårt resultat:

SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;

Resultat:

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

Den här gången fick vi fyra rader, istället för de två som vi fick i vårt första exempel.

Vi kan se att båda Cathys returnerades istället för bara en som i vårt första exempel.

Vad gäller Bill? Det finns två räkningar i Teachers tabell, men bara en returneras här. Det beror förmodligen på att det finns en faktura i Students tabell, vilket skulle utesluta en av räkningarna från våra resultat.

Ett alternativ

Det är möjligt att få samma resultat utan att använda EXCEPT operatör. Till exempel skulle vi kunna skriva om vårt första exempel till detta:

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

Resultat:

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

  1. Hur man får tillbaka *allt* från en lagrad procedur med JDBC

  2. MySQL lösenordsfunktion

  3. Lätt i ett nötskal

  4. Lär dig hur du prestandajusterar Microsoft SQL Server