sql >> Database >  >> RDS >> PostgreSQL

Hoe EXCEPT werkt in PostgreSQL

In PostgreSQL is de EXCEPT operator retourneert rijen die worden geretourneerd door de linkerinvoerquery die niet worden geretourneerd door de rechterinvoerquery. Dit kan ook worden aangeduid als het verschil tussen twee zoekopdrachten.

Syntaxis

De syntaxis gaat als volgt:

query1 EXCEPT [ALL] query2

Duplicaten worden verwijderd tenzij EXCEPT ALL wordt gebruikt.

Voorbeeld

Stel dat we de volgende tabellen hebben:

SELECT * FROM Teachers;
SELECT * FROM Students;

Resultaat:

 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

We kunnen de EXCEPT . gebruiken operator om docenten terug te sturen die niet ook studenten zijn:

SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;

Resultaat:

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

We krijgen dus alleen waarden die voorkomen in de Teachers tabel die niet ook voorkomt in de Students tafel.

Standaard is de EXCEPT operator geeft verschillende rijen terug. Dus in ons voorbeeld wordt slechts één rij geretourneerd voor Cathy , ook al zijn er twee leraren met die naam.

Het bovenstaande voorbeeld is het equivalent van de volgende zoekopdracht:

SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;

Resultaat:

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

Dit is hetzelfde resultaat dat we kregen toen er geen expliciete DISTINCT . was trefwoord. We kunnen duplicaten opnemen met de ALL trefwoord (hierover later meer).

We kunnen verschillende resultaten krijgen, afhankelijk van welke tabel aan de linkerkant is en welke aan de rechterkant. Hier is een voorbeeld waarin de Students tabel aan de linkerkant en Teachers aan de rechterkant:

SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;

Resultaat:

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

Deze keer krijgen we leerlingen die niet ook leraar zijn.

Duplicaten opnemen

Standaard is de EXCEPT operator past impliciet een DISTINCT toe operatie. Met andere woorden, het retourneert standaard alleen afzonderlijke waarden.

We kunnen de ALL zoekwoord om duplicaten in ons resultaat op te nemen:

SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;

Resultaat:

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

Deze keer kregen we vier rijen, in plaats van de twee die we in ons eerste voorbeeld kregen.

We kunnen zien dat beide Cathy's zijn geretourneerd in plaats van slechts één zoals in ons eerste voorbeeld.

Wat betreft Bill? Er zijn twee rekeningen in de Teachers tabel, maar er wordt hier slechts één geretourneerd. Dat komt waarschijnlijk omdat er één rekening is in de Students tabel, die een van de rekeningen van onze resultaten zou uitsluiten.

Een alternatief

Het is mogelijk om hetzelfde resultaat te krijgen zonder de EXCEPT exploitant. We zouden ons eerste voorbeeld hier bijvoorbeeld naar kunnen herschrijven:

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

Resultaat:

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

  1. Dubbele rijen in een primaire sleuteltabel.

  2. SQL Server verbinden met PostgreSQL

  3. Fout ORA-65048 bij het wijzigen van het gebruikerswachtwoord in de containerdatabase (CDB)

  4. Functies van PostgreSQL-back-upmethode in AWS S3