Heim >Datenbank >MySQL-Tutorial >Wie verbinde ich effizient mit der ersten Zeile einer verwandten Tabelle in SQL?

Wie verbinde ich effizient mit der ersten Zeile einer verwandten Tabelle in SQL?

DDD
DDDOriginal
2025-01-17 06:18:09600Durchsuche

How to Efficiently Join to the First Row of a Related Table 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 1Falle

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn