In einem Selbst-Join wird eine Tabelle mit sich selbst verknüpft, indem sie mit einem unterschiedlichen Korrelationsnamen referenziert wird.
Der folgende Selbst-Join produziert eine Liste von Mitarbeiterpaaren. Jeder Mitarbeitername erscheint in Kombination mit jedem anderen Mitarbeiternamen.
SELECT a.GivenName, a.Surname, b.GivenName, b.Surname FROM Employees AS a CROSS JOIN Employees AS b; |
GivenName | Surname | GivenName | Surname |
---|---|---|---|
Fran | Whitney | Fran | Whitney |
Fran | Whitney | Matthew | Cobb |
Fran | Whitney | Philip | Chin |
Fran | Whitney | Julie | Jordan |
... | ... | ... | ... |
Da die Tabelle "Employees" 75 Zeilen hat, enthält dieser Join 75 x 75 = 5625 Zeilen. Allerdings enthält er auch Zeilen, in denen der Mitarbeiter mit sich selbst aufgelistet wird. Beispielsweise enthält er folgende Zeile:
GivenName | Surname | GivenName | Surname |
---|---|---|---|
Fran | Whitney | Fran | Whitney |
Um Zeilen auszuschließen, die einen Namen doppelt enthalten, fügen Sie in einer Join-Bedingung hinzu, dass die Mitarbeiter-IDs nicht übereinstimmen dürfen.
SELECT a.GivenName, a.Surname, b.GivenName, b.Surname FROM Employees AS a CROSS JOIN Employees AS b WHERE a.EmployeeID != b.EmployeeID; |
Ohne diese Duplikatzeilen enthält der Join 75 x 74 = 5550 Zeilen.
Dieser neue Join enthält Zeilen, die jeden Mitarbeiter mit allen anderen Mitarbeitern auflistet, wobei aber jedes Namenspaar in zwei Kombinationen erscheint. So werden im Ergebnis des oben genannten Joins die beiden folgenden Zeilen aufgelistet:
GivenName | Surname | GivenName | Surname |
---|---|---|---|
Matthew | Cobb | Fran | Whitney |
Fran | Whitney | Matthew | Cobb |
Wenn die Reihenfolge der Namen nicht wichtig ist, können Sie eine Liste der (75 x 74) / 2 = 2775 eindeutigen Paare erstellen.
SELECT a.GivenName, a.Surname, b.GivenName, b.Surname FROM Employees AS a CROSS JOIN Employees AS b WHERE a.EmployeeID < b.EmployeeID; |
Diese Anweisung entfernt doppelte Zeilen, indem nur jene Zeilen ausgewählt werden, in denen die "EmployeeID" des Mitarbeiters a niedriger ist als die des Mitarbeiters b.
Folgender Selbst-Join verwendet die Korrelationsnamen "report" und "manager", um die beiden Instanzen der Tabelle "Employees" zu unterscheiden, sodass eine Liste der Mitarbeiter und ihrer Abteilungsleiter erstellt werden kann.
SELECT report.GivenName, report.Surname, manager.GivenName, manager.Surname FROM Employees AS report JOIN Employees AS manager ON (report.ManagerID = manager.EmployeeID) ORDER BY report.Surname, report.GivenName; |
Diese Anweisung liefert das Ergebnis, das nachstehend auszugsweise dargestellt wird. Die Mitarbeiternamen erscheinen in den beiden linken Spalten, die Namen der jeweiligen Abteilungsleiter rechts.
GivenName | Surname | GivenName | Surname |
---|---|---|---|
Alex | Ahmed | Scott | Evans |
Joseph | Barker | Jose | Martinez |
Irene | Barletta | Scott | Evans |
Jeannette | Bertrand | Jose | Martinez |
... | ... | ... | ... |
Der folgende Selbst-Join erzeugt eine Liste aller Manager, denen zwei Ebenen von Mitarbeitern unterstellt sind, mit der Anzahl der betreffenden Mitarbeiter auf der zweiten Ebene.
SELECT higher.managerID, count(*) second_level_reports FROM employees lower JOIN employees higher ON ( lower.managerID = higher.employeeID ) GROUP BY higher.managerID ORDER BY higher.managerID DESC; |
Das Ergebnis der oben stehenden Abfrage enthält die folgenden Zeilen:
ManagerID | second_level_reports |
---|---|
1293 | 30 |
902 | 23 |
501 | 22 |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |