SQL Server JOIN-Klausel
- 12-09-2022
- Toanngo92
- 0 Comments
Mục lục
Einführung von JOIN in SQL Server
JOIN wird verwendet, um Daten aus zwei oder mehr Tabellen basierend auf der logischen Beziehung zwischen den Tabellen abzurufen. Ein Join ( JOIN ) gibt normalerweise eine Fremdschlüsselbeziehung zwischen Tabellen an. Es bestimmt, wie zwei Tabellen in einer Abfrage in Beziehung stehen, indem es:
- Geben Sie die Spalte aus jeder Tabelle an, die für den Join verwendet werden soll ( JOIN ). Ein typischer Join ( JOIN ) gibt einen Fremdschlüssel aus einer Tabelle und den zugehörigen Schlüssel in einer anderen an.
- Geben Sie einen logischen Operator wie =, <> an, der zum Vergleichen von Werten aus Spalten verwendet werden soll.
Der JOIN kann in der FROM- oder WHERE-Klausel angegeben werden.
Syntax:
SELECT <ColumnName1>, <ColumnName2>, ... <ColumnNameN> FROM Table_Name1 AS alias_1 JOIN Table_Name2 AS alias_2 ON alias_1.<RelatedColumn> = alias_2.<RelatedColumn>
Angenommen, Sie möchten eine Liste der Mitarbeiternamen, Nachnamen und Berufsbezeichnungen aus den Tabellen „HumanResources.Employee“ und „Person.Person“ abrufen. Um die Informationen von 2 Tabellen zu erhalten, müssen die 2 Tabellen gemäß der Fremdschlüsselzuordnung der BusinessEntiyID-Spalte verknüpft werden. Zum Beispiel:
SELECT A.FirstName,A.LastName,B.JobTitle FROM Person.Person A JOIN HumanResources.Employee B ON A.BusinessEntityID = B.BusinessEntityID
Wenn wir dieses Problem weiter entwickeln, haben wir 3 konzeptionelle JOINS-Typen:
- Innere Verknüpfungen
- Äußere Verknüpfungen
- Selbst beitritt
Innerer Beitritt
Ein innerer Join wird gebildet, wenn Datensätze aus zwei Tabellen nur kombiniert werden, wenn Zeilen aus beiden Tabellen basierend auf einer gemeinsamen Spalte abgeglichen werden.
Unterschied zwischen JOIN und INNER JOIN : JOIN gibt alle Zeilen aus Tabellen zurück, bei denen der Schlüsselsatz einer Tabelle gleich den Schlüsselsätzen einer anderen Tabelle ist . INNER JOIN wählt alle Zeilen aus beiden Join-Tabellen aus, solange es eine Übereinstimmung zwischen den Spalten gibt
Syntax:
SELECT <ColumnName1>,<ColumnName2> ... <ColumnNameN> FROM Table_A AS Table_Alias_A INNER JOIN Table_B AS Table_Alias_B ON Table_Alias_A.<RelatedColumn> = Table_Alias_B.<RelatedColumn>
Zum Beispiel:
SELECT A.FirstName, A.LastName, B.JobTitle FROM Person.Person A INNER JOIN HumanResources.Employee B ON A.BusinessEntityID = b.BusinessEntityID
Äußerer Join
Outer Joins sind Join-Anweisungen, die alle Zeilen aus mindestens einer der in der FROM -Klausel angegebenen Tabellen zurückgeben, solange diese Zeilen eine der WHERE- oder HAVING- Bedingungen der SELECT-Anweisung erfüllen. Zwei häufig verwendete Outer-Join-Typen sind wie folgt:
- Linke äußere Verbindung
- Rechte äußere Verknüpfung
Linke äußere Verbindung
Der linke äußere Join gibt alle Datensätze aus der linken Tabelle und nur den rechten übereinstimmenden Datensatz zurück.
Syntax:
SELECT <ColumnList> FROM Table_A AS ALIAS_A LEFT OUTER JOIN Table_B AS ALIAS_B ON ALIAS_A.<RelatedColumn> = ALIAS_B.<RelatedColumn>
Angenommen, Sie möchten alle Kunden-IDs aus der Sales.Customers-Tabelle und Bestellinformationen wie Versanddaten, Fälligkeitsdaten, sogar Kunden abrufen, die keine Bestellungen aufgegeben haben, aber die Anzahl der Datensätze ist sehr groß, sodass wir vorher ein Bestelllimit festlegen 2019 führen Sie dazu den LEFT OUTER JOIN wie folgt aus:
SELECT A.CustomerID, B.DueDate, B.ShipDAte FROM Sales.Customer A LEFT OUTER JOIN Sales.SalesOrderHeader B ON A.CustomerID = B.CustomerID AND YEAR(B.DueDate) < 2019
Im obigen Code ist der Left Outer Join eine Struktur zwischen den Tabellen Sales.Customer und Sales.SalesOrderHeader . Die Tabelle wird basierend auf der Kunden-ID-Spalte verknüpft. In dieser Situation sind alle Datensätze der linken Tabelle Sales.Customer und nur die übereinstimmenden Datensätze der rechten Tabelle Sales.SalesOrderHeader . Wenn die Daten der rechten Tabelle nicht übereinstimmen, wird die linke Tabelle trotzdem abgerufen und die Tabelle an das Recht der Daten wird null zurückgeben.
Rechte äußere Verknüpfung
Right Outer Join ruft alle Datensätze aus der rechten Tabelle des Joins ab, unabhängig davon, ob es eine Übereinstimmung in der ersten Tabelle gibt.
SELECT <ColumnList> FROM Left_Table_Name AS Alias_A RIGHT OUTER JOIN Table_B as ALIAS_B ON Alias_A.<RelatedColumn> = Allias_B.<RelatedColumn>
Sie möchten beispielsweise alle Produktnamen aus der Produkttabelle und alle zugehörigen Bestellungen aus der SalesOrderDetail-Tabelle abrufen, obwohl möglicherweise Produktdatensätze vorhanden sind, die nicht mit den Daten in der SalesOrderDetail-Tabelle übereinstimmen (Produkte, die noch nicht verkauft wurden). immer) wie folgt:
SELECT P.Name,S.SalesOrderID FROM Sales.SalesOrderDetail S RIGHT OUTER JOIN Production.Product P ON P.ProductID = S.ProductID
Selbst beitreten
Ein Self-Join-Join wird verwendet, um die Beziehung zwischen Datensätzen in derselben Tabelle anzuzeigen. Eine mit sich selbst verknüpfte Tabelle wird Self-Join genannt.
Beispielsweise möchten Sie die Selbstverknüpfung verwenden, um die Produktdetails abzurufen, die in der Tabelle Production.Product dieselbe Farbe haben
SELECT p1.ProductID, p1.Color, p1.Name, p2.Name FROM Production.Product p1 INNER JOIN Production.Product p2 ON p1.Color = p2.Color ORDER BY p1.ProductID
MERGE .-Anweisung
Mit der MERGE-Anweisung können Sie mit einer einzigen Anweisung eine Zieltabelle unter bestimmten Join-Bedingungen für eine Quelltabelle verwalten.
Wenn Sie zum Beispiel möchten:
- Vergleichen Sie den Nachnamen und den Vornamen des Kunden aus 2 Quell- und Zieltabellen
- Aktualisieren Sie die Kundeninformationen in der Zieltabelle, wenn Vorname und Nachname übereinstimmen
- Fügen Sie der Zieltabelle einen neuen Datensatz hinzu, wenn der Nachname und die Vornamen in der Quelltabelle nicht in der Zieltabelle vorhanden sind
- Löschen Sie Datensätze in der Zieltabelle, wenn Nachname und Vorname nicht mit der Quelltabelle übereinstimmen
Die MERGE-Anweisung schließt Aufgaben in einer einzigen Anweisung ab. Mit MERGE können Sie auch Datensätze anzeigen, die mit der OUTPUT-Klausel eingefügt, aktualisiert oder gelöscht wurden.
Syntax:
MERGE target_table USING source_table ON match_condition WHEN MATCHED THEN UPDATE SET col1 = vale [,Col2 = val2] WHEN [TARGET] NOT MATCHED THEN INSERT (Col1[,Col2...]) VALUES(Val1[,Val2...]) WHEN NOT MATCH BY SOURCE THEN DELETE [OUTPUT $action, inserted.Col1,Deleted.Col1,....];
Erklären:
- target_table: die Zieltabelle, in der sich die Daten hier ändern
- source_table: Quelltabelle, enthält Datensätze, die in der Zieltabelle hinzugefügt, aktualisiert und gelöscht werden können
- match_conditions: die Join-Bedingung (JOIN) und alle Vergleichsoperatoren.
- MATCHED: gibt true zurück, wenn target_table- und source_table-Datensätze mit match_condition übereinstimmen.
- NOT MATCHED: gibt true zurück, wenn der Datensatz aus source_table nicht in target_table existiert.
- SOURCE NOT MATCH: Gibt zurück, ob der Datensatz in target_table, aber nicht in source_table existiert.
- AUSGABE: Die optionale Klausel ermöglicht die Anzeige von Datensätzen, die in target_Table thematisiert/gelöscht/aktualisiert wurden.
Die MERGE-Anweisung endet mit einem Semikolon (;).
Zum Beispiel:
use AdventureWorks2019 go SET IDENTITY_INSERT [Person].[AddressType] ON MERGE INTO [Person].[AddressType] AS Target USING (VALUES (1,'Billing') , (2,'Home'),(3,'Headquarters'),(4,'Primary'),(5,'Shipping'),(6,'Archival'),(7,'Contact'),(8,'Alternative')) AS Source ([AddressTypeID],[Name]) ON (Target.[AddressTypeID] = Source.[AddressTypeID]) WHEN MATCHED AND (Target.[Name] <> Source.[Name]) THEN UPDATE SET [Name] = Source.[NAME] WHEN NOT MATCHED BY TARGET THEN INSERT ([AddressTypeID],[Name]) VALUES(Source.[AddressTypeID],Source.[Name]) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $action, Inserted.[AddressTypeID], Inserted.Name, Deleted.[AddressTypeID], Deleted.Name;
Tabelle Person.AddressType ist die Zieltabelle, Beispieldaten werden über den USING-Befehl eingefügt (VALUES (1,’Billing‘) , (2,’Home‘),(3,’Headquarters‘),(4,’Primary‘) ,(5,’Shipping‘),(6,’Archival‘),(7,’Contact‘),(8,’Alternative‘)) AS Quelle ist die Quelltabelle, die Übereinstimmungsbedingung ist die AddressTypeID-Spalte beider Tabellen Quelle und Ziel. Wenn die Übereinstimmungsbedingung als falsch ausgewertet wird (NICHT ZUSAMMENGEPASST). Neue Datensätze werden der Zieltabelle hinzugefügt. Wenn die Übereinstimmungsbedingungen wahr (MATCHED) zurückgeben, wird der Datensatz basierend auf den Daten der Quelltabelle in der Zieltabelle aktualisiert.
Wenn die Datensätze in der Zieltabelle nicht mit der Quelltabelle übereinstimmen (NOT MATCHED BY SOURCE), werden sie aus der Zieltabelle gelöscht. Die Rolle der letzten Anweisung besteht darin, die hinzugefügten/aktualisierten/gelöschten Zeilen zu melden und die Ausgabe anzuzeigen.