web-dev-qa-db-fra.com

Comment fonctionne la sous-requête dans l'instruction select dans oracle

J'ai cherché partout pour une explication, comment fonctionne la sous-requête dans une déclaration sélective et je ne peux toujours pas saisir le concept en raison d'explications très vagues.

Je voudrais savoir comment utilisez-vous une sous-requête dans une instruction select dans Oracle et qu'est-ce qu'elle produit exactement.

Par exemple, si j'avais une requête qui voulait afficher les noms des employés et le nombre de profils qu'ils gèrent à partir de ces tables

Employé (EmpName, EmpId)

Profil (ProfileId, ..., EmpId)

comment utiliser la sous-requête?

Je pensais qu'une sous-requête était nécessaire dans l'instruction select pour implémenter le groupe par fonction afin de compter le nombre de profils gérés pour chaque employé, mais je ne suis pas trop sûr.

17
user3054901

C'est simple-

SELECT empname,
       empid,
       (SELECT COUNT (profileid)
          FROM profile
         WHERE profile.empid = employee.empid)
           AS number_of_profiles
  FROM employee;

C'est encore plus simple lorsque vous utilisez une jointure de table comme celle-ci:

  SELECT e.empname, e.empid, COUNT (p.profileid) AS number_of_profiles
    FROM employee e LEFT JOIN profile p ON e.empid = p.empid
GROUP BY e.empname, e.empid;

Explication de la sous-requête:

Essentiellement, une sous-requête dans un select obtient une valeur scalaire et la transmet à la requête principale. Une sous-requête dans select n'est pas autorisée à passer plus d'une ligne et plus d'une colonne, ce qui est une restriction. Ici, nous passons un count à la requête principale, qui, comme nous le savons, ne serait toujours qu'un nombre - une valeur scalaire. Si aucune valeur n'est trouvée, la sous-requête renvoie null à la requête principale. De plus, une sous-requête peut accéder aux colonnes de la clause from de la requête principale, comme indiqué dans ma requête où employee.empid est passé de la requête externe à la requête interne.


Modifier:

Lorsque vous utilisez une sous-requête dans une clause select, Oracle la traite essentiellement comme une jointure gauche (vous pouvez le voir dans le expliquer le plan pour votre requête), avec la cardinalité des lignes étant juste un à droite pour chaque rangée à gauche.


Explication de la jointure gauche

Une jointure gauche est très pratique, surtout lorsque vous souhaitez remplacer la sous-requête select en raison de ses restrictions. Il n'y a aucune restriction ici sur le nombre de lignes des tables de chaque côté de la LEFT JOIN mot-clé.

Pour plus d'informations, consultez Oracle Docs on subqueries et jointure gauche ou jointure externe gauche .

26
Rachcha

Dans le SGBDR Oracle, il est possible d'utiliser une sous-requête à plusieurs lignes dans la clause select tant que la (sous-) sortie est encapsulée en tant que collection. En particulier, une sous-requête de clause de sélection à plusieurs lignes peut générer chacune de ses lignes sous la forme d'un élément xml encapsulé dans une forêt xml.

0
lambdakiki