Heim >Datenbank >MySQL-Tutorial >Wie verbinde ich effizient mit der ersten Zeile einer verwandten Tabelle in SQL?
Nur die erste Zeile aus einer verwandten Tabelle in SQL auswählen
Viele Datensätze enthalten Zeilen mit mehreren Einträgen aus verwandten Tabellen. Das effiziente Zusammenführen dieser Tabellen erfordert eine Strategie zur Vermeidung von Datenduplizierungen. In diesem Artikel wird gezeigt, wie Sie für jeden Eintrag in der Haupttabelle nur die erste Zeile einer zugehörigen Tabelle verknüpfen.
Die Herausforderung: Doppelte Verknüpfungen vermeiden
Eine einfache Verknüpfung kann für jede Bestellung mehrere Zeilen erzeugen, wenn die zugehörige Tabelle mehrere Einträge für eine einzelne Bestell-ID enthält. Wir benötigen eine Methode, um nur die erste relevante Zeile auszuwählen.
Ineffektiver Ansatz: Die TOP 1
Falle
Ein naiver Versuch, TOP 1
innerhalb einer inneren Auswahl zu verwenden, schlägt fehl, weil die innere Abfrage nicht auf die Spalten der äußeren Tabelle zugreifen kann (wie OrderID
).
Effektive Lösungen: Zwei bewährte Methoden
Zwei zuverlässige Methoden erzielen das gewünschte Ergebnis:
1. CROSS APPLY
(SQL Server 2005 und höher):
Dieser Ansatz verwendet CROSS APPLY
, um die äußeren und inneren Abfragen effizient zu korrelieren:
<code class="language-sql">SELECT Orders.OrderNumber, LineItems2.Quantity, LineItems2.Description FROM Orders CROSS APPLY ( SELECT TOP 1 LineItems.Quantity, LineItems.Description FROM LineItems WHERE LineItems.OrderID = Orders.OrderID ) LineItems2</code>
2. INNER JOIN
(Für SQL Server-Versionen vor 2005):
Bei älteren SQL Server-Versionen erzielt ein INNER JOIN
mit einer Unterabfrage das gleiche Ergebnis:
<code class="language-sql">SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description FROM Orders JOIN LineItems ON LineItems.LineItemGUID = ( SELECT TOP 1 LineItemGUID FROM LineItems WHERE OrderID = Orders.OrderID )</code>
Beide Methoden verwenden TOP 1
, um nur die erste passende Zeile aus LineItems
auszuwählen. Dadurch wird Datenredundanz vermieden.
Sicherstellung deterministischer Ergebnisse
Entscheidend ist, dass die „erste“ Zeile ohne eine ORDER BY
-Klausel innerhalb der inneren SELECT
-Anweisung willkürlich ist. Verschiedene Abfrageausführungen können selbst bei identischen Daten unterschiedliche Ergebnisse liefern. Fügen Sie immer eine ORDER BY
-Klausel in die innere Abfrage ein, um konsistente und vorhersehbare Ergebnisse zu gewährleisten. Zum Beispiel:
<code class="language-sql">SELECT TOP 1 LineItems.Quantity, LineItems.Description FROM LineItems WHERE LineItems.OrderID = Orders.OrderID ORDER BY LineItems.SomeColumn -- Add a column to order by</code>
Ein SQLfiddle-Beispiel, das diese Techniken demonstriert, ist verfügbar (Link weggelassen, da es hier nicht möglich ist, einen Live-SQLfiddle-Link zu erstellen). Praktische Beispiele finden Sie in den Online-Ressourcen.
Das obige ist der detaillierte Inhalt vonWie verbinde ich effizient mit der ersten Zeile einer verwandten Tabelle in SQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!