PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment INTERSECT fonctionne dans PostgreSQL

Dans PostgreSQL, le INTERSECT L'opérateur combine deux requêtes, mais ne renvoie que les lignes renvoyées dans les deux requêtes.

Syntaxe

La syntaxe ressemble à ceci :

query1 INTERSECT [ALL] query2

Les doublons sont éliminés sauf si INTERSECT ALL est utilisé.

Exemple

Supposons que nous ayons les tables suivantes :

SELECT * FROM Employees;
SELECT * FROM Customers;

Résultat :

 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

Nous pouvons utiliser le INTERSECT opérateur pour renvoyer les employés qui sont également des clients :

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Résultat :

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

Nous n'obtenons donc que les valeurs qui apparaissent dans le Employees tableau qui apparaît également dans le Customers table.

Par défaut, il renvoie des lignes distinctes, de sorte qu'une seule ligne est renvoyée pour Monish, même s'il existe plusieurs employés et plusieurs clients portant ce nom.

C'est la même chose que de faire ceci :

SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Résultat :

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

Nous obtenons donc le même résultat que lorsque nous n'avons pas inclus le DISTINCT opérateur.

Inclure les doublons

Comme mentionné, le INTERSECT L'opérateur ne renvoie que des valeurs distinctes par défaut. Mais nous pouvons ajouter le ALL mot-clé pour inclure les doublons :

SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Résultat :

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

Cette fois, nous avons quatre lignes, au lieu des trois que nous avions dans notre premier exemple.

Nous pouvons voir que deux lignes contenant le nom Monish ont été renvoyées au lieu d'une seule comme dans notre premier exemple. Il y a en fait trois clients appelés Monish, mais seulement deux employés portant ce nom. L'opération n'en croise donc que deux.

Une requête alternative

Il est possible d'obtenir le même résultat sans utiliser le INTERSECT opérateur. Par exemple, nous pourrions réécrire notre premier exemple en ceci :

SELECT 
    DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);

Résultat :

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