PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak INTERSECT działa w PostgreSQL

W PostgreSQL INTERSECT operator łączy dwa zapytania, ale zwraca tylko te wiersze, które są zwracane w obu zapytaniach.

Składnia

Składnia wygląda tak:

query1 INTERSECT [ALL] query2

Duplikaty są eliminowane, chyba że INTERSECT ALL jest używany.

Przykład

Załóżmy, że mamy następujące tabele:

SELECT * FROM Employees;
SELECT * FROM Customers;

Wynik:

 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

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:

 employeename 
--------------
 Ava
 Rohit
 Monish

Więc otrzymujemy tylko wartości, które pojawiają się w Employees tabela, która pojawia się również w Customers stół.

Domyślnie zwraca różne wiersze, więc dla Monish zwracany jest tylko jeden wiersz, mimo że istnieje wielu pracowników i wielu klientów o tej nazwie.

To tak samo, jak zrobienie tego:

SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Wynik:

 employeename 
--------------
 Ava
 Rohit
 Monish

Otrzymujemy więc ten sam wynik, który otrzymaliśmy, gdy nie uwzględniliśmy DISTINCT operatora.

Dołącz duplikaty

Jak wspomniano, INTERSECT operator domyślnie zwraca tylko różne wartości. Ale możemy dodać ALL słowo kluczowe do uwzględnienia duplikatów:

SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Wynik:

 employeename 
--------------
 Ava
 Rohit
 Monish
 Monish

Tym razem otrzymaliśmy cztery wiersze, zamiast trzech, które otrzymaliśmy w naszym pierwszym przykładzie.

Widzimy, że zostały zwrócone dwa wiersze zawierające nazwę Monish zamiast jednego, jak w naszym pierwszym przykładzie. W rzeczywistości jest trzech klientów o nazwie Monish, ale tylko dwóch pracowników o tej nazwie. Dlatego operacja przecina tylko dwa z nich.

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:

 employeename 
--------------
 Ava
 Rohit
 Monish

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak napisać ograniczenie dotyczące maksymalnej liczby wierszy w postgresql?

  2. Czy możesz utworzyć indeks w definicji CREATE TABLE?

  3. Mapowanie tablicy za pomocą Hibernate

  4. PostgreSQL:eksport danych wynikowych z zapytania SQL do Excela/CSV

  5. Zdefiniować nazwy tabel i kolumn jako argumenty w funkcji plpgsql?