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.
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 .
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.