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

Explication de l'opérateur Oracle INTERSECT

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.