sql >> Databáze >  >> RDS >> PostgreSQL

Jak INTERSECT funguje v PostgreSQL

V PostgreSQL, INTERSECT operátor kombinuje dva dotazy, ale vrátí pouze ty řádky, které jsou vráceny v obou dotazech.

Syntaxe

Syntaxe vypadá takto:

query1 INTERSECT [ALL] query2

Duplikáty jsou eliminovány, pokud INTERSECT ALL se používá.

Příklad

Předpokládejme, že máme následující tabulky:

SELECT * FROM Employees;
SELECT * FROM Customers;

Výsledek:

 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

Můžeme použít INTERSECT operátor vrátit zaměstnance, kteří jsou zároveň zákazníky:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Výsledek:

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

Získáváme tedy pouze hodnoty, které se objevují v Employees tabulka, která se také objeví v Customers stůl.

Ve výchozím nastavení vrací odlišné řádky, takže pro Monish je vrácen pouze jeden řádek, přestože existuje více zaměstnanců a více zákazníků s tímto jménem.

Je to stejné, jako když uděláte toto:

SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Výsledek:

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

Dostaneme tedy stejný výsledek, jaký jsme dostali, když jsme nezahrnuli DISTINCT operátor.

Zahrnout duplikáty

Jak již bylo zmíněno, INTERSECT Operátor ve výchozím nastavení vrací pouze odlišné hodnoty. Můžeme však přidat ALL klíčové slovo pro zahrnutí duplikátů:

SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Výsledek:

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

Tentokrát jsme dostali čtyři řady místo tří, které jsme dostali v našem prvním příkladu.

Vidíme, že byly vráceny dva řádky obsahující jméno Monish namísto pouze jednoho jako v našem prvním příkladu. Ve skutečnosti existují tři zákazníci jménem Monish, ale pouze dva zaměstnanci s tímto jménem. Operace tedy protíná pouze dva z nich.

Alternativní dotaz

Stejný výsledek je možné získat i bez použití INTERSECT operátor. Například bychom mohli přepsat náš první příklad na toto:

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

Výsledek:

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

  1. Upgradovat sloupec PostgreSQL JSON na JSONB?

  2. proxysql-admin Alternativy - ClusterControl ProxySQL GUI

  3. Jak formátovat čísla se znaménkem mínus/plus v Oracle

  4. Jak funguje TIMESTAMPADD() v MariaDB