2013-12-13 7 views
12

Ich habe überall nach einer Erklärung gesucht, wie funktioniert die Unterabfrage in einer Select-Anweisung und noch kann ich das Konzept wegen der sehr vagen Erklärungen nicht erfassen.Wie funktioniert Unterabfrage in Select-Anweisung in Oracle

Ich würde gerne wissen, wie Sie eine Unterabfrage in einer SELECT-Anweisung in Oracle verwenden und was genau es ausgegeben wird.

Zum Beispiel, wenn ich habe eine Abfrage, die die Namen der Mitarbeiter und die Anzahl der Profile sie verwalten aus diesen Tabellen

Angestellter (EmpName, EmpID)

Profil (Profileid, angezeigt werden wollte .. ., EmpId)

Wie verwende ich die Unterabfrage?

Ich dachte, eine Unterabfrage in der Select-Anweisung benötigt wird, um die Gruppe nach Funktion zu implementieren, um die Anzahl der Profile für jeden Mitarbeiter zu verwalten, aber ich bin mir nicht sicher.

Antwort

18

Es ist einfach-

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

Noch einfacher ist es, wenn Sie eine Tabelle wie folgt verbinden 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 für die Unterabfrage:

Im Wesentlichen Eine Unterabfrage in einem select erhält einen skalaren Wert und übergibt es an die Hauptabfrage. Eine Unterabfrage in select darf nicht mehr als eine Zeile und mehr als eine Spalte passieren, was eine Einschränkung darstellt. Hier übergeben wir eine count an die Hauptabfrage, die, wie wir wissen, immer nur eine Zahl wäre - ein skalarer Wert. Wenn kein Wert gefunden wird, gibt die Unterabfrage null an die Hauptabfrage zurück. Darüber hinaus kann eine Unterabfrage auf Spalten aus der from-Klausel der Hauptabfrage zugreifen, wie in meiner Abfrage gezeigt, wobei employee.empid von der äußeren Abfrage an die innere Abfrage übergeben wird.


bearbeitet:

Wenn Sie eine Unterabfrage in einer select-Klausel verwenden, Oracle behandelt im Wesentlichen es als LEFT JOIN (Sie dies in den explain plan für Ihre Abfrage sehen), mit der Mächtigkeit die Reihen sind nur eine rechts von jeder Reihe auf der linken Seite.


Erklärung für die linke beitreten

A LEFT JOIN ist sehr praktisch, vor allem, wenn Sie die select subquery aufgrund seiner Einschränkungen ersetzt werden soll. Die Anzahl der Zeilen der Tabellen auf beiden Seiten des Schlüsselworts LEFT JOIN unterliegt keinen Einschränkungen.

Für weitere Informationen lesen Sie Oracle Docs on subqueries und left join or left outer join.

+0

Vielen Dank! das hat wirklich geholfen. Eine Frage allerdings. Sie haben gesagt, dass die Unterabfrage nicht mehr als eine Spalte passieren darf. Das heißt, wenn ich eine SUMME-Funktion hinzufügen möchte, müsste ich eine andere Unterabfrage verwenden. oder ist es möglich, mehr als nur eine Unterabfrage in select zu haben? – user3054901

+0

Ja. Sie können mehrere Unterabfragen in einer Auswahlliste verwenden. Sie müssen eine andere Unterabfrage verwenden, um eine SUMME-Funktion hinzuzufügen. – Rachcha

+0

Vielen Dank für Ihre Hilfe :) – user3054901

0

In Oracle RDBMS ist es möglich, eine mehrzeilige Unterabfrage in der SELECT-Klausel zu verwenden, solange die (Unter-) Ausgabe als Sammlung gekapselt ist.Insbesondere kann eine Unterabfrage mit mehrzeiligen Auswahlklauseln jede ihrer Zeilen als ein xmlelement ausgeben, das in einem xmlforest eingekapselt ist.

Verwandte Themen