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 |
Wenn Sie Zeilen ausschließen wollen, 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 Abteilungsleiter in den rechten.
GivenName | Surname | GivenName | Surname |
---|---|---|---|
Alex | Ahmed | Scott | Evans |
Joseph | Barker | Jose | Martinez |
Irene | Barletta | Scott | Evans |
Jeannette | Bertrand | Jose | Martinez |
... | ... | ... | ... |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |