Utilisation des opérateurs Set

Les opérateurs Set sont utilisés pour joindre les résultats de deux instructions SELECT (ou plus). Les opérateurs SET disponibles dans Oracle 11g sont UNION, UNION ALL, INTERSECT et MINUS.

L'opérateur d'ensemble UNION renvoie les résultats combinés des deux instructions SELECT. Essentiellement, il supprime les doublons des résultats, c'est-à-dire qu'une seule ligne sera répertoriée pour chaque résultat dupliqué.Pour contrer ce comportement, utilisez l'opérateur d'ensemble UNION ALL qui conserve les doublons dans le résultat final.INTERSECT répertorie uniquement les enregistrements communs aux deux requêtes SELECT; L'opérateur de jeu MINUS supprime les résultats de la deuxième requête de la sortie s'ils sont également trouvés dans les résultats de la première requête. Les opérations d'ensembles INTERSECT et MINUS produisent des résultats sans duplication.

Tous les opérateurs SET partagent le même degré de priorité entre eux.Au lieu de cela, lors de l'exécution de la requête, Oracle commence l'évaluation de gauche à droite ou de haut en bas.Si des parenthèses sont utilisées explicitement, l'ordre peut différer car les parenthèses auraient la priorité sur opérateurs pendantes.

Points à retenir -

  • Le même nombre de colonnes doit être sélectionné par toutes les instructions SELECT participantes. Les noms de colonnes utilisés dans l'affichage sont extraits de la première requête.

  • Les types de données de la liste de colonnes doivent être compatibles / implicitement convertibles par oracle. Oracle n'effectuera pas de conversion de type implicite si les colonnes correspondantes dans les requêtes de composants appartiennent à différents groupes de types de données.Par exemple, si une colonne de la première requête de composant est du type de données DATE et que la colonne correspondante dans la deuxième requête de composant est de données tapez CHAR, Oracle n'effectuera pas de conversion implicite, mais lèvera l'erreur ORA-01790.

  • L'ordre de position doit être utilisé pour trier l'ensemble de résultats. L'ordre des ensembles de résultats individuels n'est pas autorisé avec les opérateurs Set. ORDER BY peut apparaître une fois à la fin de la requête. Par exemple,

  • Les opérateurs UNION et INTERSECT sont commutatifs, c'est-à-dire que l'ordre des requêtes n'est pas important; cela ne change pas le résultat final.

  • En termes de performances, UNION ALL affiche de meilleures performances par rapport à UNION car les ressources ne sont pas gaspillées pour filtrer les doublons et trier le jeu de résultats.

  • Les opérateurs d'ensemble peuvent faire partie des sous-requêtes.

  • Les opérateurs Set ne peuvent pas être utilisés dans les instructions SELECT contenant des expressions de collection TABLE.

  • Les tables LONG, BLOB, CLOB, BFILE, VARRAY ou imbriquées ne sont pas autorisées dans les opérateurs Set.For, la clause update n'est pas autorisée avec les opérateurs set.

SYNDICAT

Lorsque plusieurs requêtes SELECT sont jointes à l'aide de l'opérateur UNION, Oracle affiche le résultat combiné de toutes les requêtes SELECT composées, après avoir supprimé tous les doublons et dans l'ordre trié (croissant par défaut), sans ignorer les valeurs NULL.

Considérez les cinq requêtes ci-dessous jointes à l'aide de l'opérateur UNION. Le jeu de résultats combiné final contient la valeur de tous les SQL. Notez la suppression de la duplication et le tri des données.

SELECT 1 NUM FROM DUAL
UNION
SELECT 5 FROM DUAL 
UNION
SELECT 3 FROM DUAL
UNION
SELECT 6 FROM DUAL
UNION
SELECT 3 FROM DUAL;

NUM
-------
1
3
5
6

Pour être noté, les colonnes sélectionnées dans les requêtes SELECT doivent être de type de données compatible. Oracle envoie un message d'erreur lorsque la règle est violée.

SELECT TO_DATE('12-OCT-03') FROM DUAL
UNION
SELECT '13-OCT-03' FROM DUAL;

SELECT TO_DATE('12-OCT-03') FROM DUAL
       *
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression

UNION TOUT

UNION et UNION ALL sont similaires dans leur fonctionnement avec une légère différence. Mais UNION ALL donne le jeu de résultats sans supprimer la duplication et trier les données. Par exemple, dans la requête ci-dessus UNION est remplacé par UNION ALL pour voir l'effet.

Considérez la requête illustrée dans la section UNION. Notez la différence dans la sortie qui est générée sans tri ni déduplication.

SELECT 1 NUM FROM DUAL
UNION ALL
SELECT 5 FROM DUAL 
UNION ALL
SELECT 3 FROM DUAL
UNION ALL
SELECT 6 FROM DUAL
UNION ALL
SELECT 3 FROM DUAL;

NUM
-------
1
5
3
6
3

COUPER

À l'aide de l'opérateur INTERSECT, Oracle affiche les lignes communes des deux instructions SELECT, sans doublons et sans données classées par ordre trié (croissant par défaut).

Par exemple, la requête SELECT ci-dessous récupère le salaire qui est courant dans les départements 10 et 20.Comme selon les normes SQL ISO, INTERSECT est au-dessus des autres par rapport à l'évaluation des opérateurs d'ensemble, mais cela n'est pas encore incorporé par Oracle.

SELECT SALARY
FROM employees
WHERE DEPARTMENT_ID = 10
INTRESECT
SELECT SALARY 
FROM employees
WHERE DEPARTMENT_ID = 20

SALARY
---------
1500
1200
2000

MOINS

L'opérateur Moins affiche les lignes qui sont présentes dans la première requête mais absentes dans la seconde requête, sans doublons et données organisées par défaut par ordre croissant.

SELECT JOB_ID
FROM employees
WHERE DEPARTMENT_ID = 10
MINUS
SELECT JOB_ID
FROM employees
WHERE DEPARTMENT_ID = 20;

JOB_ID
-------------        
HR
FIN
ADMIN

Correspondance avec l'instruction SELECT

Il peut y avoir des scénarios dans lesquels les instructions SELECT composées peuvent avoir un nombre et un type de données différents des colonnes sélectionnées. Par conséquent, pour correspondre explicitement à la liste des colonnes, les colonnes NULL sont insérées aux positions manquantes afin de correspondre au nombre et au type de données des colonnes sélectionnées dans chaque instruction SELECT. Pour les colonnes numériques, zéro peut également être remplacé pour correspondre au type des colonnes sélectionnées dans la requête.

Dans la requête ci-dessous, le type de données du nom de l'employé (varchar2) et de l'ID d'emplacement (numéro) ne correspondent pas. Par conséquent, l'exécution de la requête ci-dessous soulèverait une erreur en raison d'un problème de compatibilité.

SELECT DEPARTMENT_ID "Dept", first_name "Employee"
FROM employees
UNION
SELECT DEPARTMENT_ID, LOCATION_ID
FROM departments;

ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression

Explicitement, les colonnes peuvent être mises en correspondance en remplaçant NULL par l'ID d'emplacement et le nom de l'employé.

SELECT DEPARTMENT_ID "Dept", first_name "Employee", NULL "Location"
FROM employees
UNION
SELECT DEPARTMENT_ID, NULL "Employee", LOCATION_ID
FROM departments;

Utilisation de la clause ORDER BY dans les opérations SET

La clause ORDER BY ne peut apparaître qu'une seule fois à la fin de la requête contenant des instructions SELECT composées. Cela implique que les instructions SELECT individuelles ne peuvent pas avoir de clause ORDER BY. En outre, le tri peut être basé sur les colonnes qui apparaissent uniquement dans la première requête SELECT. Pour cette raison, il est recommandé de trier la requête composée en utilisant les positions des colonnes.

La requête compund ci-dessous unifie les résultats de deux départements et trie par la colonne SALAIRE.

SELECT employee_id, first_name, salary
FROM employees
WHERE department_id=10
UNION
SELECT employee_id, first_name, salary
FROM employees
WHERE department_id=20
ORDER BY 3;