Suche…


Einführung

In SQL (Structured Query Language) ist ein JOIN eine Methode zum Verknüpfen zweier Datentabellen in einer einzigen Abfrage, die es der Datenbank ermöglicht, einen Satz mit Daten aus beiden Tabellen gleichzeitig zurückzugeben, oder Daten aus einer Tabelle als Tabelle verwenden Filter auf der zweiten Tabelle. Im ANSI SQL-Standard sind verschiedene Arten von JOINs definiert.

Inner Join

Inner join gibt nur die Datensätze / Zeilen zurück, die basierend auf einer oder mehreren Bedingungen (angegeben mit dem Schlüsselwort ON ) in beiden Tabellen übereinstimmen / existieren. Dies ist die häufigste Art der Verknüpfung. Die allgemeine Syntax für inner join lautet:

SELECT * 
FROM table_1
INNER JOIN table_2
  ON table_1.column_name = table_2.column_name

Es kann auch als JOIN vereinfacht werden:

SELECT * 
FROM table_1
JOIN table_2
  ON table_1.column_name = table_2.column_name

Beispiel

/* Sample data. */
DECLARE @Animal table (
    AnimalId Int IDENTITY,
    Animal Varchar(20)
);

DECLARE @AnimalSound table (
    AnimalSoundId Int IDENTITY,
    AnimalId Int,
    Sound Varchar(20)
);

INSERT INTO @Animal (Animal) VALUES ('Dog');
INSERT INTO @Animal (Animal) VALUES ('Cat');
INSERT INTO @Animal (Animal) VALUES ('Elephant');

INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (1, 'Barks');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (2, 'Meows');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (3, 'Trumpets');
/* Sample data prepared. */

SELECT 
    * 
FROM 
    @Animal
    JOIN @AnimalSound
        ON @Animal.AnimalId = @AnimalSound.AnimalId;
AnimalId    Animal               AnimalSoundId AnimalId    Sound
----------- -------------------- ------------- ----------- --------------------
1           Dog                  1             1           Barks
2           Cat                  2             2           Meows
3           Elephant             3             3           Trumpets

Inner Join mit linkem Outer Join verwenden (Ersatz für Nicht vorhanden)

Diese Abfrage gibt Daten aus Tabelle 1 zurück, wobei Felder, die mit Tabelle2 mit einem Schlüssel übereinstimmen, und Daten, die nicht in Tabelle 1 enthalten sind, wenn mit Tabelle2 mit einer Bedingung und einem Schlüssel verglichen werden

select * 
  from Table1 t1
    inner join Table2 t2 on t1.ID_Column = t2.ID_Column 
    left  join Table3 t3 on t1.ID_Column = t3.ID_Column 
  where t2.column_name = column_value 
    and t3.ID_Column is null 
  order by t1.column_name;

Cross Join

A cross join ist eine kartesische Verknüpfung, dh ein kartesisches Produkt aus beiden Tabellen. Dieser Join benötigt keine Bedingung, um zwei Tabellen zu verbinden. Jede Zeile in der linken Tabelle wird mit jeder Zeile der rechten Tabelle verbunden. Syntax für einen Cross Join:

SELECT * FROM table_1
CROSS JOIN table_2 

Beispiel:

/* Sample data. */
DECLARE @Animal table (
    AnimalId Int IDENTITY,
    Animal Varchar(20)
);

DECLARE @AnimalSound table (
    AnimalSoundId Int IDENTITY,
    AnimalId Int,
    Sound Varchar(20)
);

INSERT INTO @Animal (Animal) VALUES ('Dog');
INSERT INTO @Animal (Animal) VALUES ('Cat');
INSERT INTO @Animal (Animal) VALUES ('Elephant');

INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (1, 'Barks');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (2, 'Meows');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (3, 'Trumpet');
/* Sample data prepared. */

SELECT 
    * 
FROM 
    @Animal 
    CROSS JOIN @AnimalSound;

Ergebnisse:

AnimalId    Animal               AnimalSoundId AnimalId    Sound
----------- -------------------- ------------- ----------- --------------------
1           Dog                  1             1           Barks
2           Cat                  1             1           Barks
3           Elephant             1             1           Barks
1           Dog                  2             2           Meows
2           Cat                  2             2           Meows
3           Elephant             2             2           Meows
1           Dog                  3             3           Trumpet
2           Cat                  3             3           Trumpet
3           Elephant             3             3           Trumpet

Beachten Sie, dass ein CROSS JOIN auf andere Arten angewendet werden kann. Dies ist ein "alter Stil" -Join (veraltet seit ANSI SQL-92) ohne Bedingung, was zu einem Kreuz / kartesischen Join führt:

SELECT * 
FROM @Animal, @AnimalSound;

Diese Syntax funktioniert auch aufgrund einer Join-Bedingung "Always True", wird jedoch nicht empfohlen und sollte aus Gründen der Lesbarkeit zugunsten der expliziten CROSS JOIN Syntax vermieden werden.

SELECT * 
FROM 
    @Animal 
    JOIN @AnimalSound 
        ON 1=1

Äußere Join

Linke äußere Verbindung

LEFT JOIN gibt alle Zeilen der linken Tabelle zurück, die mit den Zeilen der rechten Tabelle übereinstimmen, in denen die Bedingungen der ON Klausel erfüllt sind. Zeilen, in denen die ON Klausel nicht erfüllt ist, weisen in allen Spalten der rechten Tabelle NULL auf. Die Syntax eines LEFT JOIN lautet:

SELECT * FROM table_1 AS t1
LEFT JOIN table_2 AS t2 ON t1.ID_Column = t2.ID_Column 

Rechter äußerer Join

RIGHT JOIN gibt alle Zeilen der rechten Tabelle zurück, die mit den Zeilen der linken Tabelle übereinstimmen, in denen die Bedingungen der ON Klausel erfüllt sind. Zeilen, in denen die ON Klausel nicht erfüllt ist, weisen in allen Spalten der linken Tabelle NULL auf. Die Syntax eines RIGHT JOIN lautet:

SELECT * FROM table_1 AS t1
RIGHT JOIN table_2 AS t2 ON t1.ID_Column = t2.ID_Column 

Voller äußerer Join

FULL JOIN kombiniert LEFT JOIN und RIGHT JOIN . Alle Zeilen werden aus beiden Tabellen zurückgegeben, unabhängig davon, ob die Bedingungen in der ON Klausel erfüllt sind. Zeilen, die die ON Klausel nicht erfüllen, werden in allen Spalten der gegenüberliegenden Tabelle mit NULL zurückgegeben ( NULL für eine Zeile in der linken Tabelle enthalten alle Spalten in der rechten Tabelle NULL und umgekehrt). Die Syntax eines FULL JOIN lautet:

SELECT * FROM table_1 AS t1
FULL JOIN table_2 AS t2 ON t1.ID_Column = t2.ID_Column  

Beispiele

/* Sample test data. */
DECLARE @Animal table (
    AnimalId Int IDENTITY,
    Animal Varchar(20)
);

DECLARE @AnimalSound table (
    AnimalSoundId Int IDENTITY,
    AnimalId Int,
    Sound Varchar(20)
);

INSERT INTO @Animal (Animal) VALUES ('Dog');
INSERT INTO @Animal (Animal) VALUES ('Cat');
INSERT INTO @Animal (Animal) VALUES ('Elephant');
INSERT INTO @Animal (Animal) VALUES ('Frog');

INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (1, 'Barks');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (2, 'Meows');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (3, 'Trumpet');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (5, 'Roars');
/* Sample data prepared. */

LINKE ÄUSSERE VERBINDUNG

SELECT * 
FROM @Animal As t1 
LEFT JOIN @AnimalSound As t2 ON t1.AnimalId = t2.AnimalId;

Ergebnisse für LEFT JOIN

AnimalId    Animal               AnimalSoundId AnimalId    Sound
----------- -------------------- ------------- ----------- --------------------
1           Dog                  1             1           Barks
2           Cat                  2             2           Meows
3           Elephant             3             3           Trumpet
4           Frog                 NULL          NULL        NULL

RECHTE AUSSEN VERBINDEN

SELECT * 
FROM @Animal As t1 
RIGHT JOIN @AnimalSound As t2 ON t1.AnimalId = t2.AnimalId;

Ergebnisse für RIGHT JOIN

AnimalId    Animal               AnimalSoundId AnimalId    Sound
----------- -------------------- ------------- ----------- --------------------
1           Dog                  1             1           Barks
2           Cat                  2             2           Meows
3           Elephant             3             3           Trumpet
NULL        NULL                 4             5           Roars

VOLL AUSSEN MITGLIED

SELECT * 
FROM @Animal As t1 
FULL JOIN @AnimalSound As t2 ON t1.AnimalId = t2.AnimalId;

Ergebnisse für FULL JOIN

AnimalId    Animal               AnimalSoundId AnimalId    Sound
----------- -------------------- ------------- ----------- --------------------
1           Dog                  1             1           Barks
2           Cat                  2             2           Meows
3           Elephant             3             3           Trumpet
4           Frog                 NULL          NULL        NULL
NULL        NULL                 4             5           Roars

Mitmachen bei einem Update

Joins können auch in einer UPDATE Anweisung verwendet werden:

CREATE TABLE Users (
    UserId int NOT NULL,
    AccountId int NOT NULL,
    RealName nvarchar(200) NOT NULL
)

CREATE TABLE Preferences (
    UserId int NOT NULL,
    SomeSetting bit NOT NULL
)

Aktualisieren Sie die SomeSetting Spalte der Tabelle " Preferences mit einem Prädikat in der Tabelle Users , wie folgt:

UPDATE p
SET p.SomeSetting = 1
FROM Users u
JOIN Preferences p ON u.UserId = p.UserId
WHERE u.AccountId = 1234

p ist ein Alias ​​für Preferences die in der FROM Klausel der Anweisung definiert sind. Nur Zeilen mit einer übereinstimmenden AccountId aus der Tabelle Users werden aktualisiert.

Aktualisieren Sie mit linken äußeren Join-Anweisungen

Update t 
SET  t.Column1=100
FROM Table1 t LEFT JOIN Table12 t2 
ON t2.ID=t.ID

Tabellen mit Inner Join- und Aggregatfunktion aktualisieren

UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
INNER JOIN (select field3, sum(field2) as field2Sum
from table2
group by field3) as t2
on t2.field3 = t1.field3  

Treten Sie einer Unterabfrage bei

Das Verknüpfen bei einer Unterabfrage wird häufig verwendet, wenn Sie aggregierte Daten (wie z. B. Count, Avg, Max oder Min) aus einer untergeordneten Tabelle / Details abrufen und diese zusammen mit Datensätzen aus der übergeordneten / Header-Tabelle anzeigen möchten. Beispielsweise möchten Sie möglicherweise die oberste / erste untergeordnete Zeile basierend auf Datum oder ID abrufen, oder Sie möchten vielleicht eine Zählung aller untergeordneten Zeilen oder einen Durchschnitt.

In diesem Beispiel werden Aliase verwendet, sodass Abfragen leichter lesbar sind, wenn mehrere Tabellen beteiligt sind. In diesem Fall rufen wir alle Zeilen aus der übergeordneten Tabelle "Bestellungen" und nur die letzte (oder letzte) untergeordnete Zeile aus der untergeordneten Tabelle "PurchaseOrderLineItems" ab. In diesem Beispiel wird davon ausgegangen, dass die untergeordnete Tabelle inkrementelle numerische IDs verwendet.

SELECT po.Id, po.PODate, po.VendorName, po.Status, item.ItemNo, 
  item.Description, item.Cost, item.Price
FROM PurchaseOrders po
LEFT JOIN 
     (
       SELECT l.PurchaseOrderId, l.ItemNo, l.Description, l.Cost, l.Price, Max(l.id) as Id 
       FROM PurchaseOrderLineItems l
       GROUP BY l.PurchaseOrderId, l.ItemNo, l.Description, l.Cost, l.Price
     ) AS item ON item.PurchaseOrderId = po.Id

Selbst beitreten

Eine Tabelle kann in einem sogenannten Self-Join mit sich selbst verbunden werden, wobei Datensätze in der Tabelle mit anderen Datensätzen in derselben Tabelle kombiniert werden. Self-Joins werden normalerweise in Abfragen verwendet, in denen eine Hierarchie in den Tabellenspalten definiert ist.

Betrachten Sie die Beispieldaten in einer Tabelle mit dem Namen Employees :

ICH WÜRDE Name Boss_ID
1 Bob 3
2 Jim 1
3 Sam 2

Jeder Mitarbeiter Boss_ID Karten auf einem anderen Mitarbeiter - ID . Um eine Liste von Mitarbeitern mit dem Namen ihres jeweiligen Chefs abzurufen, kann die Tabelle mithilfe dieser Zuordnung in sich zusammengefügt werden. Beachten Sie, dass das Verknüpfen einer Tabelle auf diese Weise die Verwendung eines Alias ​​( Bosses ) in der zweiten Referenz der Tabelle erfordert, um sich von der Originaltabelle zu unterscheiden.

SELECT Employees.Name,
    Bosses.Name AS Boss
FROM Employees
INNER JOIN Employees AS Bosses 
    ON Employees.Boss_ID = Bosses.ID

Beim Ausführen dieser Abfrage werden folgende Ergebnisse ausgegeben:

Name Boss
Bob Sam
Jim Bob
Sam Jim

Mit Join löschen

Joins können auch in einer DELETE Anweisung verwendet werden. Ein Schema wie folgt gegeben:

CREATE TABLE Users (
    UserId int NOT NULL,
    AccountId int NOT NULL,
    RealName nvarchar(200) NOT NULL
)

CREATE TABLE Preferences (
    UserId int NOT NULL,
    SomeSetting bit NOT NULL
)

Wir können Zeilen aus der Preferences Tabelle löschen und nach einem Prädikat in der Users Tabelle wie folgt filtern:

DELETE p
FROM Users u
INNER JOIN Preferences p ON u.UserId = p.UserId
WHERE u.AccountId = 1234

Hier ist p ein Alias ​​für Preferences die in der FROM Klausel der Anweisung definiert sind. Wir löschen nur Zeilen mit einer übereinstimmenden AccountId aus der Tabelle Users .

Versehentliches Verwandeln einer äußeren Verbindung in eine innere Verbindung

Äußere Joins geben alle Zeilen aus einer oder beiden Tabellen plus übereinstimmende Zeilen zurück.

Table People
PersonID FirstName
       1 Alice
       2 Bob
       3 Eve

Table Scores
PersonID Subject Score
       1 Math    100
       2 Math     54
       2 Science  98

Links bei den Tischen:

Select * from People a
left join Scores b
on a.PersonID = b.PersonID

Kehrt zurück:

PersonID FirstName PersonID Subject Score
       1 Alice            1 Math    100
       2 Bob              2 Math     54
       2 Bob              2 Science  98
       3 Eve           NULL NULL   NULL

Wenn Sie alle Personen mit den zutreffenden mathematischen Ergebnissen zurückgeben möchten, lautet ein häufiger Fehler:

Select * from People a
left join Scores b
on a.PersonID = b.PersonID
where Subject = 'Math'

Dies würde Eve aus Ihren Ergebnissen entfernen und zusätzlich Bobs Wissenschaftswert entfernen, da Subject für sie NULL .

Die korrekte Syntax zum Entfernen von Nicht-Mathematikdatensätzen unter Beibehaltung aller Personen in der Tabelle People lautet:

Select * from People a
left join Scores b
on a.PersonID = b.PersonID
and b.Subject = 'Math'


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow