Erklärung der Selbstverknüpfungen

83

Ich verstehe die Notwendigkeit von Selbstverbindungen nicht. Kann mir bitte jemand das erklären?

Ein einfaches Beispiel wäre sehr hilfreich.

l - '' '' '' - '' '' '' '' '' '' ''
quelle

Antworten:

95

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:

Tabelle emp1

Id Name Boss_id            
1   ABC   3                   
2   DEF   1                   
3   XYZ   2                   

Tabelle 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
sinnlose Politik
quelle
1
In diesem Beispiel kann ich nicht herausfinden, wer der Boss ist. Obwohl die Erfahrung gut und leicht zu verstehen ist.
MAC
2
left joinIch denke, es wäre besser, den Mitarbeiter (oder Chef), der keinen Chef hat, nicht auszulassen. der Platzhirsch!
Rockin4Life33
22

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
Windyjonas
quelle
18

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.

mjv
quelle
5

Angenommen, Sie haben einen Tisch users, der so eingerichtet ist:

  • Benutzeridentifikation
  • Nutzername
  • Manager-ID des Benutzers

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
ceejayoz
quelle
4

Sie sind nützlich, wenn Ihre Tabelle selbstreferenziell ist. Beispielsweise kann für eine Seitentabelle jede Seite einen nextund 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 nextund previousmit derselben idSpalte durch.

Max Shawabkeh
quelle
4

Stellen Sie sich eine Tabelle vor, die Employeewie 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
Klaus Byskov Pedersen
quelle
4

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.

Eugene
quelle
Aber jetzt verstehen Sie (hoffentlich), was passieren würde, wenn die Selbstreferenz nicht verfügbar wäre.
Eugene
4

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;
Mazhar MIK
quelle
3
+1 Diese Antwort ist sehr wichtig, da es so viele SQL-Fragen zu SO gibt, auf die die Antwort "Self Join verwenden" lautet, die die Leute normalerweise nicht sehen, wenn sie keine explizite (hierarchische) Selbstreferenz haben.
JimmyB
1
Auch wenn dies eine Kopie von Pasta aus w3schools ist, denke ich, dass die obige Antwort nicht die Selbstverbindung erklärt, sondern die innere Verbindung, die anders ist.
George K
3

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
BClaydon
quelle
1
Hm, im Welpen, warum machst du mit "größer als" statt "gleich"?
Marcel
1
Hallo. Ich habe gesehen, dass einige Beispiele "FROM xxx, yyy WHERE" und andere "FROM xxx JOIN yyy WHERE" verwenden. Könnten Sie bitte den Unterschied erklären?
Skan
@Skan Das ist eine wirklich gute Frage. Die kurze Antwort lautet, dass es sich um die alte Kurzschrift handelt und veraltet ist. Ich habe es vor über zehn Jahren in der Schule benutzt und sehe es selten in der Praxis. Hier ist die prägnanteste Beschreibung, die ich finden konnte: bidn.com/blogs/KathiKellenberger/sql-server/2875/…
BClaydon
1

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
Steven Stewart-Gallus
quelle
Es ist viel schneller, eine GROUP BY- und eine a HAVING-Klausel zu verwenden, um Duplikate zu finden. SELECT Name, E-Mail, COUNT ( ) FROM My_Bookings GROUP BY Name, Datum HAVING COUNT ( )> 1
George K
@ GeorgeK True. Ich nehme an, dies ist nur für eine Fuzzy-Übereinstimmung (über die Gruppierung nach TRIM (LOWER (Name)) hinaus) und nicht für eine strikte Gleichheit erforderlich.
Steven Stewart-Gallus
1

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
Sumanth Varada
quelle
0

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.

Ungeschnitten
quelle
Da mehr als eine Zeile auf ein "übergeordnetes Element" verweisen kann, kann es sich auch um einen Baum handeln, wie beispielsweise das oft zitierte Beispiel "Mitarbeiter-> Manager".
NVRAM
Ich habe nur nach einer einfachen Analogie gesucht, aber ja, ein Baum könnte auch funktionieren.
Unsliced
-4

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.

Self Join mit einem Beispiel

user1472512
quelle