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