Ich verstehe die Notwendigkeit von Selbstverbindungen nicht. Kann mir bitte jemand das erklären?
Ein einfaches Beispiel wäre sehr hilfreich.
Ich verstehe die Notwendigkeit von Selbstverbindungen nicht. Kann mir bitte jemand das erklären?
Ein einfaches Beispiel wäre sehr hilfreich.
Antworten:
Sie können Self-Join als zwei identische Tabellen anzeigen. Bei der Normalisierung können Sie jedoch nicht zwei Kopien der Tabelle erstellen, sondern simulieren lediglich zwei Tabellen mit Self-Join.
Angenommen, Sie haben zwei Tabellen:
emp1
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
emp2
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
Wenn Sie nun den Namen jedes Mitarbeiters mit den Namen seines Chefs abrufen möchten:
select c1.Name , c2.Name As Boss
from emp1 c1
inner join emp2 c2 on c1.Boss_id = c2.Id
Welches wird die folgende Tabelle ausgeben:
Name Boss
ABC XYZ
DEF ABC
XYZ DEF
left join
Ich denke, es wäre besser, den Mitarbeiter (oder Chef), der keinen Chef hat, nicht auszulassen. der Platzhirsch!
Es ist durchaus üblich, wenn Sie eine Tabelle haben, die auf sich selbst verweist. Beispiel: Eine Mitarbeitertabelle, in der jeder Mitarbeiter einen Manager haben kann und Sie alle Mitarbeiter und den Namen ihres Managers auflisten möchten.
SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id
Ein Self-Join ist ein Join einer Tabelle mit sich selbst.
Ein häufiger Anwendungsfall ist, wenn in der Tabelle Entitäten (Datensätze) gespeichert sind, zwischen denen eine hierarchische Beziehung besteht . Zum Beispiel eine Tabelle mit Personeninformationen (Name, Geburtsdatum, Adresse ...) und einer Spalte, in der die ID des Vaters (und / oder der Mutter) enthalten ist. Dann mit einer kleinen Abfrage wie
SELECT Child.ID, Child.Name, Child.PhoneNumber, Father.Name, Father.PhoneNumber
FROM myTableOfPersons As Child
LEFT OUTER JOIN myTableOfPersons As Father ON Child.FatherId = Father.ID
WHERE Child.City = 'Chicago' -- Or some other condition or none
Wir können Informationen über Kind und Vater (und Mutter, mit einem zweiten Selbstbeitritt usw. und sogar Großeltern usw.) in derselben Abfrage erhalten.
Angenommen, Sie haben einen Tisch users
, der so eingerichtet ist:
In dieser Situation können Sie Folgendes tun , wenn Sie sowohl die Benutzerinformationen als auch die Managerinformationen in einer Abfrage abrufen möchten:
SELECT users.user_id, users.user_name, managers.user_id AS manager_id, managers.user_name AS manager_name INNER JOIN users AS manager ON users.manager_id=manager.user_id
Sie sind nützlich, wenn Ihre Tabelle selbstreferenziell ist. Beispielsweise kann für eine Seitentabelle jede Seite einen next
und previous
-Link haben. Dies wären die IDs anderer Seiten in derselben Tabelle. Wenn Sie irgendwann ein Dreifach aufeinanderfolgender Seiten erhalten möchten, führen Sie zwei Self-Joins für die Spalten next
und previous
mit derselben id
Spalte durch.
Stellen Sie sich eine Tabelle vor, die Employee
wie unten beschrieben aufgerufen wird. Alle Mitarbeiter haben einen Manager, der auch ein Mitarbeiter ist (möglicherweise mit Ausnahme des CEO, dessen manager_id null wäre).
Table (Employee):
int id,
varchar name,
int manager_id
Sie können dann die folgende Auswahl verwenden, um alle Mitarbeiter und ihre Manager zu finden:
select e1.name, e2.name as ManagerName
from Employee e1, Employee e2 where
where e1.manager_id = e2.id
Ohne die Fähigkeit einer Tabelle, sich selbst zu referenzieren, müssten wir so viele Tabellen für Hierarchieebenen erstellen wie die Anzahl der Ebenen in der Hierarchie. Da diese Funktionalität verfügbar ist, verbinden Sie die Tabelle mit sich selbst und SQL behandelt sie als zwei separate Tabellen, sodass alles an einem Ort gespeichert wird.
Abgesehen von den oben genannten Antworten (die sehr gut erklärt werden) möchte ich ein Beispiel hinzufügen, damit die Verwendung von Self Join leicht gezeigt werden kann. Angenommen, Sie haben eine Tabelle mit dem Namen CUSTOMERS, die die folgenden Attribute aufweist: CustomerID, CustomerName, ContactName, City, Country. Jetzt möchten Sie alle Personen auflisten, die aus derselben Stadt stammen. Sie müssen sich eine Nachbildung dieser Tabelle überlegen, damit wir sie auf der Grundlage von CITY verbinden können. Die folgende Abfrage zeigt deutlich, was es bedeutet:
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2,
A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City
ORDER BY A.City;
Hier gibt es viele richtige Antworten, aber es gibt eine Variation, die ebenso richtig ist. Sie können Ihre Join-Bedingungen in die join-Anweisung anstelle der WHERE-Klausel einfügen.
SELECT e1.emp_id AS 'Emp_ID'
, e1.emp_name AS 'Emp_Name'
, e2.emp_id AS 'Manager_ID'
, e2.emp_name AS 'Manager_Name'
FROM Employee e1 RIGHT JOIN Employee e2 ON e1.emp_id = e2.emp_id
Denken Sie daran, dass Sie manchmal e1.manager_id> e2.id möchten
Der Vorteil, beide Szenarien zu kennen, besteht manchmal darin, dass Sie eine Menge WHERE- oder JOIN-Bedingungen haben und Ihre Self-Join-Bedingungen in die andere Klausel einfügen möchten, um Ihren Code lesbar zu halten.
Niemand hat angesprochen, was passiert, wenn ein Mitarbeiter keinen Manager hat. Huh? Sie sind nicht in der Ergebnismenge enthalten. Was ist, wenn Sie Mitarbeiter einbeziehen möchten, die keine Manager haben, aber keine falschen Kombinationen zurückgeben möchten?
Versuchen Sie diesen Welpen;
SELECT e1.emp_id AS 'Emp_ID'
, e1.emp_name AS 'Emp_Name'
, e2.emp_id AS 'Manager_ID'
, e2.emp_name AS 'Manager_Name'
FROM Employee e1 LEFT JOIN Employee e2
ON e1.emp_id = e2.emp_id
AND e1.emp_name = e2.emp_name
AND e1.every_other_matching_column = e2.every_other_matching_column
Ein Anwendungsfall ist die Suche nach doppelten Datensätzen in einer Datenbank.
SELECT A.Id FROM My_Bookings A, My_Bookings B
WHERE A.Name = B.Name
AND A.Date = B.Date
AND A.Id != B.Id
Self-Join ist nützlich, wenn Sie die Daten der Tabelle mit sich selbst auswerten müssen. Dies bedeutet, dass die Zeilen aus derselben Tabelle korreliert werden.
Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName
Zum Beispiel möchten wir die Namen der Mitarbeiter finden, deren Anfangsbezeichnung der aktuellen Bezeichnung entspricht. Wir können dies mithilfe von Self Join auf folgende Weise lösen.
SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId
Es ist das Datenbankäquivalent einer verknüpften Liste / eines verknüpften Baums, wobei eine Zeile in gewisser Weise einen Verweis auf eine andere Zeile enthält.
Hier ist die Erklärung der Selbstverbindung in Laienbegriffen. Self Join ist keine andere Art von Join. Wenn Sie andere Arten von Verknüpfungen (innere, äußere und Kreuzverknüpfungen) verstanden haben, sollte die Selbstverknüpfung einfach sein. In INNER, OUTER und CROSS JOINS verbinden Sie zwei oder mehr verschiedene Tabellen. Bei Self Join verbinden Sie jedoch dieselbe Tabelle mit itslef. Hier haben wir nicht zwei verschiedene Tabellen, sondern behandeln dieselbe Tabelle mit Tabellenaliasnamen als eine andere Tabelle. Wenn dies immer noch nicht klar ist, würde ich empfehlen, die folgenden Youtube-Videos anzuschauen.