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