Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wyjaśnienie operatora Oracle INTERSECT

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Liczba piątków między dwiema datami

  2. JSON_OBJECTAGG() Funkcja w Oracle

  3. Używanie parametrów z połączeniem Oracle ODBC

  4. Problemy z wywoływaniem procedury składowanej z C# z dużym CLOB

  5. Funkcja LN() w Oracle