Objectifs Dans ce chapitre, vous allez apprendre à résoudre différents problèmes à l'aide de Sous-Interrogations Synchronisées.
Utilisation de Sous-Interrogations Synchronisées Dans l'exemple ci-dessus, nous recherchons les employés dont le salaire est supérieur au salaire moyen de leur département. Dans ce cas, la Sous-Interrogation Synchronisée calcule explicitement le salaire moyen de chaque département. Comme les requêtes externe et interne utilisent toutes les deux la table EMP dans la clause FROM, un alias est attribué à chaque ordre SELECT pour plus de clarté. Grâce aux alias, les ordres SELECT deviennent plus lisibles et la requête s'exécute correctement, car elle peut distinguer la colonne de la table interne de celle de la table externe, ce qui ne serait pas possible sans les alias.
Sous-Interrogations Synchronisées Une Sous-Interrogation Synchronisée ou Corrrélée est une sous-interrogation imbriquée qui est exécutée une seule fois pour chaque ligne traitée par la requête principale et qui, pendant son exécution, utilise une valeur d'une colonne de la requête externe. sous-interrogations Imbriquées et Sous-Interrogations Synchronisées Avec une sous-interrogation imbriquée normale, l'ordre SELECT interne est d'abord exécuté pour retourner des valeurs qui seront récupérées par la requête principale. Par contre, une Sous-Interrogation Synchronisée est exécutée une fois pour chaque ligne candidate prise en compte par la requête externe. Autrement dit, la requête interne est pilotée par la requête externe. Exécution d'une Sous-Interrogation Synchronisée 1. Récupérer une ligne candidate (extraite par la requête externe). 2. Exécuter la requête interne avec la valeur de la ligne candidate. 3. Utiliser la ou les valeurs résultant de la requête interne pour sélectionner ou ne pas sélectionner la ligne candidate. 4. Répéter ces étapes jusqu'à ce qu'il ne reste plus de lignes candidates. Même si cette description est centrée principalement sur les Sous-Interrogations Synchronisées des ordres SELECT, elle s'applique également aux ordres UPDATE et DELETE (voir chapitre concernant la Manipulation des Données).
Sous-Interrogations Synchronisées (suite) Une Sous-Interrogation Synchronisée permet de "lire" chaque ligne d'une table et de comparer les valeurs de chaque ligne aux données associées. Elle est utilisée chaque fois qu'une sous-interrogation doit retourner un résultat ou un ensemble de résultats différent pour chaque ligne candidate prise en compte par la requête principale. Autrement dit, une Sous-Interrogation Synchronisée permet de répondre à une question à plusieurs choix, dont la réponse dépend de la valeur de chaque ligne traitée par l'ordre maître. Oracle exécute une Sous-Interrogation Synchronisée lorsque la sous-interrogation fait référence à une colonne d'une table de la requête principale.
Utilisation de Sous-Interrogations Synchronisées Dans l'exemple ci-dessus, nous recherchons les employés dont le salaire est supérieur au salaire moyen de leur département. Dans ce cas, la Sous-Interrogation Synchronisée calcule explicitement le salaire moyen de chaque département. Comme les requêtes externe et interne utilisent toutes les deux la table EMP dans la clause FROM, un alias est attribué à chaque ordre SELECT pour plus de clarté. Grâce aux alias, les ordres SELECT deviennent plus lisibles et la requête s'exécute correctement, car elle peut distinguer la colonne de la table interne de celle de la table externe, ce qui ne serait pas possible sans les alias.
L'Opérateur EXISTS Avec des ordres SELECT imbriqués, tous les opérateurs logiques sont valides. De plus, vous pouvez recourir à l'opérateur EXISTS. Cet opérateur est souvent utilisé dans les Sous-Interrogations Synchronisées, car il permet de tester s'il existe une valeur. Si la valeur existe, il retourne la valeur TRUE (vrai) ; sinon, il retourne la valeur FALSE (faux). De la même façon, l'opérateur NOT EXISTS garantit qu'il n'existe aucune valeur.
Utilisation de l'Opérateur EXISTS Cet opérateur garantit que la recherche dans la requête interne ne se poursuivra pas s'il existe au moins une correspondance entre un responsable et des numéros d'employés.
Utilisation de l'Opérateur EXISTS (suite) Notez que l'ordre interne SELECT ne doit pas retourner nécessairement une valeur spécifique, étant donné qu'aucun littéral ne peut être sélectionné. Pour des raisons de performances, il est plus rapide de sélectionner une constante qu'une colonne. Autre solution Comme le montre cet exemple, il est possible d'utiliser une structure NOT IN à la place de l'opérateur NOT EXISTS. Cependant, vous devez l'utiliser avec prudence, car elle retourne la valeur FALSE si un membre du groupe a une valeur NULL. Dans ce cas, votre requête ne ramènera aucune ligne. SQL> SELECT deptno, dname 2 FROM dept 3 WHERE deptno NOT IN (SELECT deptno 4 FROM emp);
Même si cette description est centrée principalement sur les Sous-Interrogations Synchronisées des ordres SELECT, elle s'applique également aux ordres UPDATE et DELETE (voir chapitre concernant la Manipulation des Données).