Dans Oracle Database, le INTERSECT
L'opérateur est utilisé pour créer une requête composée qui renvoie l'intersection des résultats de gauche et de droite SELECT
déclarations. En d'autres termes, il combine deux requêtes, mais ne renvoie que les lignes renvoyées dans les deux requêtes.
Exemple
Supposons que nous ayons les tables suivantes :
SELECT * FROM Employees;
SELECT * FROM Customers;
Résultat :
ID EMPLOYÉ | NOM DE L'EMPLOYÉ |
---|---|
1 | Bart |
2 | Jan |
3 | Ava |
4 | Rohit |
5 | Monish |
6 | Monish |
7 | Monish |
ID CLIENT | NOM DU CLIENT |
---|---|
1 | Mia |
2 | Rohit |
3 | Pierre |
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 :
NOM DE L'EMPLOYÉ |
---|
Ava |
Monish |
Rohit |
Ainsi, il ne renvoie que les valeurs qui apparaissent à la fois dans les champs Employees
table et le Customers
table.
Implémentation de la base de données Oracle de l'INTERSECT
L'opérateur renvoie uniquement des lignes distinctes. Nous pouvons le voir dans l'exemple ci-dessus. Il renvoie une seule ligne pour Monish, même s'il existe plusieurs employés et plusieurs clients portant ce nom.
Certains SGBDR nous permettent d'inclure des doublons dans le résultat en acceptant un ALL
facultatif mot-clé avec le INTERSECT
opérateur, mais Oracle n'en fait pas partie (du moins, pas au moment de la rédaction). SQLite non plus.
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 :
NOM DE L'EMPLOYÉ |
---|
Rohit |
Ava |
Monish |
Quelques choses à retenir
Notez que les expressions doivent correspondre en nombre et doivent appartenir au même groupe de types de données. Par conséquent, nous ne pouvons pas effectuer les actions suivantes :
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId, CustomerName FROM Customers;
Résultat :
ORA-01789: query block has incorrect number of result columns
Ou ceci :
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers;
Résultat :
ORA-01790: expression must have same datatype as corresponding expression
Cependant, nous pouvons utiliser des fonctions comme TO_CHAR()
pour convertir une colonne en un groupe de types de données approprié :
SELECT EmployeeName FROM Employees
INTERSECT
SELECT TO_CHAR(CustomerId) FROM Customers;
Résultat :
no data found
Dans ce cas, aucune donnée n'a été trouvée car aucun des CustomerId
les valeurs correspondaient à l'un des EmployeeName
valeurs. Mais s'ils le faisaient, alors nous verrions les matchs.