W bazie danych Oracle INTERSECT operator służy do tworzenia zapytania złożonego, które zwraca część wspólną wyników lewego i prawego SELECT sprawozdania. Innymi słowy, łączy dwa zapytania, ale zwraca tylko te wiersze, które są zwracane w obu zapytaniach.
Przykład
Załóżmy, że mamy następujące tabele:
SELECT * FROM Employees;
SELECT * FROM Customers; Wynik:
| ID PRACOWNIKA | NAZWA PRACOWNIKA |
|---|---|
| 1 | Bart |
| 2 | sty |
| 3 | Awa |
| 4 | Rohit |
| 5 | Pomnij |
| 6 | Pomnij |
| 7 | Pomnij |
| ID KLIENTA | NAZWA KLIENTA |
|---|---|
| 1 | Mia |
| 2 | Rohit |
| 3 | Piotr |
| 4 | Awa |
| 5 | Pomnij |
| 6 | Pomnij |
Możemy użyć INTERSECT operator zwraca pracowników, którzy są również klientami:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers; Wynik:
| NAZWA PRACOWNIKA |
|---|
| Awa |
| Pomnij |
| Rohit |
Zwraca więc tylko te wartości, które pojawiają się w obu polach Employees tabela i Customers stół.
Implementacja Oracle Database INTERSECT operator zwraca tylko różne wiersze. Widzimy to w powyższym przykładzie. Zwraca tylko jeden wiersz dla Monish, mimo że istnieje wielu pracowników i wielu klientów o tej nazwie.
Niektóre RDBMS pozwalają nam na uwzględnienie duplikatów w wyniku poprzez zaakceptowanie opcjonalnego ALL słowo kluczowe z INTERSECT operator, ale Oracle nie jest jednym z nich (przynajmniej nie w chwili pisania tego tekstu). Podobnie jak SQLite.
Alternatywne zapytanie
Możliwe jest uzyskanie tego samego wyniku bez użycia INTERSECT operator. Na przykład moglibyśmy przepisać nasz pierwszy przykład do tego:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName); Wynik:
| NAZWA PRACOWNIKA |
|---|
| Rohit |
| Awa |
| Pomnij |
Niektóre rzeczy do zapamiętania
Należy zauważyć, że wyrażenia muszą być zgodne pod względem liczby i muszą należeć do tej samej grupy typów danych. Dlatego nie możemy wykonać następujących czynności:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId, CustomerName FROM Customers; Wynik:
ORA-01789: query block has incorrect number of result columns
Albo to:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers; Wynik:
ORA-01790: expression must have same datatype as corresponding expression
Chociaż możemy używać funkcji takich jak TO_CHAR() aby przekonwertować kolumnę na odpowiednią grupę typów danych:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT TO_CHAR(CustomerId) FROM Customers; Wynik:
no data found
W tym przypadku nie znaleziono żadnych danych, ponieważ żaden z CustomerId wartości pasowały do dowolnego z EmployeeName wartości. Ale gdyby tak się stało, zobaczylibyśmy mecze.