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

Sådan fungerer INTERSECT i PostgreSQL

I PostgreSQL er INTERSECT operator kombinerer to forespørgsler, men returnerer kun de rækker, der returneres i begge forespørgsler.

Syntaks

Syntaksen ser sådan ud:

query1 INTERSECT [ALL] query2

Dubletter elimineres, medmindre INTERSECT ALL bruges.

Eksempel

Antag, at vi har følgende tabeller:

SELECT * FROM Employees;
SELECT * FROM Customers;

Resultat:

 employeeid | employeename 
------------+--------------
          1 | Bart
          2 | Jan
          3 | Ava
          4 | Rohit
          5 | Monish
          6 | Monish
          7 | Monish

 customerid | customername 
------------+--------------
          1 | Mia
          2 | Rohit
          3 | Peter
          4 | Ava
          5 | Monish
          6 | Monish

Vi kan bruge INTERSECT operatør til at returnere medarbejdere, der også er kunder:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Resultat:

 employeename 
--------------
 Ava
 Rohit
 Monish

Så vi får kun værdier, der vises i Employees tabel, der også vises i Customers bord.

Som standard returnerer den adskilte rækker, så kun én række returneres for Monish, selvom der er flere ansatte og flere kunder med det navn.

Det er det samme som at gøre dette:

SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Resultat:

 employeename 
--------------
 Ava
 Rohit
 Monish

Så vi får det samme resultat, som vi fik, da vi ikke inkluderede DISTINCT operatør.

Medtag dubletter

Som nævnt er INTERSECT operatør returnerer kun distinkte værdier som standard. Men vi kan tilføje ALL søgeord for at inkludere dubletter:

SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Resultat:

 employeename 
--------------
 Ava
 Rohit
 Monish
 Monish

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

Vi kan se, at to rækker med navnet Monish blev returneret i stedet for blot én som i vores første eksempel. Der er faktisk tre kunder, der hedder Monish, men kun to medarbejdere med det navn. Derfor skærer operationen kun to af dem.

En alternativ forespørgsel

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

SELECT 
    DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);

Resultat:

 employeename 
--------------
 Ava
 Rohit
 Monish

  1. Hvorfor brug af enhedstests er en stor investering i højkvalitetsarkitektur

  2. MAX() – Find den maksimale værdi i en kolonne i MySQL

  3. MySQL-replikering:Fejlgående transaktioner i GTID-baseret replikering

  4. Multi-Cloud-implementering til MySQL-replikering