sql >> Databáze >  >> RDS >> Oracle

Vysvětlení operátora Oracle INTERSECT

V databázi Oracle je to INTERSECT operátor se používá k vytvoření složeného dotazu, který vrací průnik výsledků levého a pravého SELECT prohlášení. Jinými slovy, kombinuje dva dotazy, ale vrací pouze ty řádky, které jsou vráceny v obou dotazech.

Příklad

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

SELECT * FROM Employees;
SELECT * FROM Customers;

Výsledek:

ID ZAMĚSTNANCE EMPLOYEENAME
1 Bart
2 Leden
3 Ava
4 Rohit
5 Monština
6 Monština
7 Monština
CUSTOMERID JMÉNO ZÁKAZNÍKA
1 Mia
2 Rohit
3 Petr
4 Ava
5 Monština
6 Monština

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:

JMÉNO ZAMĚSTNANCE
Ava
Monština
Rohit

Vrací tedy pouze hodnoty, které se objevují v obou Employees tabulky a Customers stůl.

Implementace INTERSECT Oracle Database operátor vrací pouze odlišné řádky. Můžeme to vidět na výše uvedeném příkladu. Vrátí pouze jeden řádek pro Monish, i když existuje více zaměstnanců a více zákazníků s tímto jménem.

Některé RDBMS nám umožňují zahrnout duplikáty do výsledku přijetím volitelného ALL klíčové slovo s INTERSECT operátor, ale Oracle mezi ně nepatří (alespoň ne v době psaní). Ani SQLite.

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:

JMÉNO ZAMĚSTNANCE
Rohit
Ava
Monština

Něco k zapamatování

Všimněte si, že výrazy se musí shodovat v počtu a musí být ve stejné skupině datových typů. Proto nemůžeme udělat následující:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId, CustomerName FROM Customers;

Výsledek:

ORA-01789: query block has incorrect number of result columns

Nebo toto:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers;

Výsledek:

ORA-01790: expression must have same datatype as corresponding expression

Můžeme však použít funkce jako TO_CHAR() převést sloupec na vhodnou skupinu datových typů:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT TO_CHAR(CustomerId) FROM Customers;

Výsledek:

no data found

V tomto případě nebyla nalezena žádná data, protože žádné z CustomerId hodnoty odpovídaly jakémukoli z EmployeeName hodnoty. Ale pokud ano, pak bychom viděli zápasy.


  1. odstranit sloupec neexistuje

  2. Jak dočasně deaktivuji spouštěče v PostgreSQL?

  3. SQL select elementy, kde součet polí je menší než N

  4. Amazon RDS pro PostgreSQL alternativy - ClusterControl pro PostgreSQL