Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Daten abfragen und ändern » Joins: Daten aus mehreren Tabellen abrufen » Spezielle Joins

 

Selbst-Joins

In einem Selbst-Join wird eine Tabelle mit sich selbst verknüpft, indem sie mit einem unterschiedlichen Korrelationsnamen referenziert wird.

Beispiel 1

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.

Beispiel 2

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
... ... ... ...