sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur INTERSECT fungerar i PostgreSQL

I PostgreSQL, INTERSECT operatorn kombinerar två frågor, men returnerar endast de rader som returneras i båda frågorna.

Syntax

Syntaxen ser ut så här:

query1 INTERSECT [ALL] query2

Dubbletter elimineras såvida inte INTERSECT ALL används.

Exempel

Anta att vi har följande 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 använda INTERSECT operatör att returnera anställda som också är kunder:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Resultat:

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

Så vi får bara värden som visas i Employees tabell som också visas i Customers tabell.

Som standard returnerar den distinkta rader, så endast en rad returneras för Monish, även om det finns flera anställda och flera kunder med det namnet.

Det är samma sak som att göra det här:

SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Resultat:

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

Så vi får samma resultat som vi fick när vi inte inkluderade DISTINCT operatör.

Inkludera dubbletter

Som nämnts, INTERSECT operatören returnerar endast distinkta värden som standard. Men vi kan lägga till ALL nyckelord för att inkludera dubbletter:

SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Resultat:

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

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

Vi kan se att två rader som innehåller namnet Monish returnerades istället för bara en som i vårt första exempel. Det finns faktiskt tre kunder som heter Monish, men bara två anställda med det namnet. Därför skär operationen bara två av dem.

En alternativ fråga

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

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

Resultat:

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

  1. hur man använder Blob datatype i Postgres

  2. Använder variabeln env i Spring Boots application.properties

  3. Spring Docker-container kan inte komma åt Postgres Docker-container

  4. vilken jdbc-burk man ska använda med Oracle 11g &jdk 1.6 och hur man ansluter till själva db:n