Les opérateurs ensemblistes UNION, EXCEPT et INTERSECT permettent de fusionner dans une même requête plusieurs requêtes externes. Toutes les requêtes réunies par ces opérateurs ensemblistes sont exécutées et leurs résultats respectifs sont associés. Le résultat dépend de l'opérateur utilisé.
Pour dériver une table résultat, l'opérateur UNION associe deux autres tables résultat (par exemple, TABLE1 et TABLE2) et élimine de ces tables les lignes en double. Lorsque ALL est utilisé avec UNION (UNION ALL), les lignes en double ne sont pas éliminées. Dans un cas comme dans l'autre, toutes les lignes de la table dérivée proviennent soit de TABLE1, soit de TABLE2.
Dans l'exemple suivant, la requête utilise l'opérateur UNION pour renvoyer les noms de toutes les personnes ayant un salaire supérieur à 21 000 F, ou qui ont des responsabilités de directeur et moins de 8 ans de présence dans la société :
(1)
SELECT ID, NAME FROM STAFF WHERE SALARY > 21000 UNION
(2)
SELECT ID, NAME FROM STAFF WHERE JOB='Mgr' AND YEARS < 8 ORDER BY ID
Voici les résultats des différentes requêtes :
(1)
ID NAME ------ --------- 140 Fraye 160 Molinare 260 Jones
(2)
ID NAME ------ --------- 10 Sanders 30 Marenghi 100 Plotz 140 Fraye 160 Molinare 240 Daniels
Le gestionnaire de bases de données associe les résultats des deux requêtes, élimine les doublons et renvoie le résultat final trié par ordre croissant.
ID NAME ------ --------- 10 Sanders 30 Marenghi 100 Plotz 140 Fraye 160 Molinare 240 Daniels 260 Jones
Si, dans une requête, vous devez utiliser la clause ORDER BY avec un opérateur ensembliste, écrivez-la après la dernière requête. Le système effectue le classement de l'ensemble des réponses obtenues.
Si le nom d'une colonne diffère entre les deux tables, la table associant tous les résultats ne trouve pas la correspondance. Les colonnes sont alors numérotées dans l'ordre où elles apparaissent. Dans ce cas, pour que les résultats soient classés, il faut préciser les numéros de colonne dans une clause ORDER BY.
Pour dériver une table résultat, l'opérateur EXCEPT inclut toutes les lignes se trouvant dans TABLE1 mais non dans TABLE2 et il élimine les lignes en double. Si ALL est utilisé avec EXCEPT (EXCEPT ALL), les lignes en double ne sont pas éliminées.
Dans l'exemple suivant, la requête utilise l'opérateur EXCEPT pour renvoyer les noms de toutes les personnes gagnant plus de 21000 F, mais n'ayant pas le titre de directeur et justifiant de 8 ans de présence, ou plus, dans la société :
SELECT ID, NAME FROM STAFF WHERE SALARY > 21000 EXCEPT SELECT ID, NAME FROM STAFF WHERE JOB='Mgr' AND YEARS < 8
Les résultats des différentes requêtes se trouvent dans la section réservée à l'opérateur UNION. L'instruction ci-dessus donne le résultat suivant :
ID NAME ------ --------- 260 Jones
Pour dériver une table résultat, l'opérateur INTERSECT n'inclut que les lignes existant à la fois dans TABLE1 et TABLE2 et élimine les lignes en double. Si ALL est utilisé avec INTERSECT (INTERSECT ALL), les lignes en double ne sont pas éliminées.
Dans l'exemple suivant, la requête utilise l'opérateur INTERSECT pour renvoyer les noms et les ID de toutes les personnes ayant un salaire supérieur à 21000 F, des responsabilités de directeur et moins de 8 ans de présence dans la société :
SELECT ID, NAME FROM STAFF WHERE SALARY > 21000 INTERSECT SELECT ID, NAME FROM STAFF WHERE JOB='Mgr' AND YEARS < 8
Les résultats des différentes requêtes se trouvent dans la section réservée à l'opérateur UNION. Voici le résultat de deux requêtes sur lesquelles l'opérateur INTERSECT a été appliqué :
ID NAME ------ --------- 140 Fraye 160 Molinare
Lorsque vous utilisez les opérateurs UNION, EXCEPT et INTERSECT, gardez à l'esprit que :