Ganz einfach-
SELECT empname,
empid,
(SELECT COUNT (profileid)
FROM profile
WHERE profile.empid = employee.empid)
AS number_of_profiles
FROM employee;
Es ist sogar noch einfacher, wenn Sie einen Tabellen-Join wie diesen verwenden:
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;
Erklärung zur Unterabfrage:
Im Wesentlichen eine Unterabfrage in einem select
erhält einen Skalarwert und übergibt ihn an die Hauptabfrage. Eine Unterabfrage in select
darf nicht mehr als eine Zeile und mehr als eine Spalte übergeben, was eine Einschränkung darstellt. Hier übergeben wir einen count
zur Hauptabfrage, die bekanntlich immer nur eine Zahl wäre - ein Skalarwert. Wenn kein Wert gefunden wird, gibt die Unterabfrage null
zurück zur Hauptabfrage. Außerdem kann eine Unterabfrage auf Spalten von from
zugreifen -Klausel der Hauptabfrage, wie in meiner Abfrage gezeigt, wo employee.empid
wird von der äußeren Abfrage an die innere Abfrage übergeben.
Bearbeiten :
Wenn Sie eine Unterabfrage in einem select
verwenden -Klausel behandelt Oracle sie im Wesentlichen als Linksverknüpfung (Sie können dies im Erklärplan für Ihre Abfrage sehen), wobei die Kardinalität der Zeilen nur eins auf der rechten Seite für jede Zeile auf der linken Seite ist.
Erklärung für den linken Join
Ein linker Join ist sehr praktisch, besonders wenn Sie select
ersetzen möchten Unterabfrage aufgrund ihrer Einschränkungen. Hier gibt es keine Beschränkungen für die Anzahl der Zeilen der Tabellen auf beiden Seiten des LEFT JOIN
Schlüsselwort.
Weitere Informationen finden Sie in den Oracle-Dokumenten zu Unterabfragen und Left Join oder Left Outer Join.