Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie funktioniert die Unterabfrage in der ausgewählten Anweisung in Oracle?

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.