sql >> Database >  >> RDS >> PostgreSQL

Hoe INTERSECT werkt in PostgreSQL

In PostgreSQL is de INTERSECT operator combineert twee query's, maar retourneert alleen die rijen die in beide query's worden geretourneerd.

Syntaxis

De syntaxis gaat als volgt:

query1 INTERSECT [ALL] query2

Duplicaten worden verwijderd tenzij INTERSECT ALL wordt gebruikt.

Voorbeeld

Stel dat we de volgende tabellen hebben:

SELECT * FROM Employees;
SELECT * FROM Customers;

Resultaat:

 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

We kunnen de INTERSECT . gebruiken operator om werknemers terug te sturen die ook klant zijn:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Resultaat:

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

We krijgen dus alleen waarden die voorkomen in de Employees tabel die ook verschijnen in de Customers tafel.

Standaard retourneert het verschillende rijen, dus er wordt slechts één rij geretourneerd voor Monish, ook al zijn er meerdere werknemers en meerdere klanten met die naam.

Het is hetzelfde als dit doen:

SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Resultaat:

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

We krijgen dus hetzelfde resultaat als toen we de DISTINCT . niet meenamen telefoniste.

Duplicaten opnemen

Zoals gezegd, de INTERSECT operator retourneert standaard alleen afzonderlijke waarden. Maar we kunnen de ALL . toevoegen zoekwoord om duplicaten op te nemen:

SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Resultaat:

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

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

We kunnen zien dat twee rijen met de naam Monish zijn geretourneerd in plaats van slechts één zoals in ons eerste voorbeeld. Er zijn eigenlijk drie klanten die Monish heten, maar slechts twee medewerkers met die naam. Daarom snijdt de bewerking er slechts twee.

Een alternatieve zoekopdracht

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

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

Resultaat:

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

  1. Hoe u rijen filtert zonder NULL in een kolom

  2. Einde van ondersteuning voor SQL Server 2008 &2008 R2

  3. Invoegverklaringen genereren uit tekstbestanden voor SQL Server-tabel in SQL Server - SQL Server / TSQL-zelfstudie, deel 106

  4. Voer alleen een trigger uit wanneer bepaalde kolommen zijn bijgewerkt (SQL-server)