Heim >Datenbank >MySQL-Tutorial >Wie eliminiert man doppelte Bestellnummern beim Zusammenführen von Tabellen mit mehreren Einzelposten?
Vermeidung doppelter Bestellnummern in mehrzeiligen Artikelverknüpfungen
Datenbankverknüpfungen mit Tabellen mit mehreren Einzelposten pro Bestellung führen oft zu doppelten Bestellnummern in den Ergebnissen. In diesem Artikel werden effiziente Lösungen untersucht, um nur einen Datensatz pro eindeutiger Bestellung abzurufen.
Erstansatz und seine Mängel
Ein einfacher Ansatz könnte darin bestehen, nur die Werbebuchung „TOP 1“ auszuwählen. Dies schlägt jedoch aufgrund von Einschränkungen beim direkten Zugriff auf die äußere Tabelle aus der inneren Select-Anweisung fehl.
Effiziente Lösung: CROSS APPLY
Der CROSS APPLY
-Operator bietet eine elegante Lösung:
<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>
CROSS APPLY
ruft effizient die erste Position für jede Bestellung ab und verhindert so doppelte Bestellnummern.
Alternative für ältere SQL Server-Versionen: INNER JOIN
Für SQL Server-Versionen vor 2005 bietet ein INNER JOIN
eine vergleichbare Lösung:
<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>
Sicherstellung deterministischer Ergebnisse
Entscheidend ist, dass TOP 1
ohne eine ORDER BY
-Klausel nicht deterministisch ist. Das ausgewählte Einzelelement kann zwischen Abfrageausführungen variieren, auch wenn die Daten unverändert bleiben. Fügen Sie immer eine ORDER BY
-Klausel in die innere Abfrage ein, um konsistente Ergebnisse zu gewährleisten.
Das obige ist der detaillierte Inhalt vonWie eliminiert man doppelte Bestellnummern beim Zusammenführen von Tabellen mit mehreren Einzelposten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!