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.