Ich werde ein konkretes, aber hypothetisches Beispiel verwenden.
Jede Bestellung hat normalerweise nur eine Werbebuchung :
Aufträge:
OrderGUID OrderNumber
========= ============
{FFB2...} STL-7442-1
{3EC6...} MPT-9931-8A
LineItems:
LineItemGUID Order ID Quantity Description
============ ======== ======== =================================
{098FBE3...} 1 7 prefabulated amulite
{1609B09...} 2 32 spurving bearing
Gelegentlich gibt es jedoch eine Bestellung mit zwei Werbebuchungen:
LineItemID Order ID Quantity Description
========== ======== ======== =================================
{A58A1...} 6,784,329 5 pentametric fan
{0E9BC...} 6,784,329 5 differential girdlespring
Normalerweise, wenn dem Benutzer die Bestellungen angezeigt werden:
SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
INNER JOIN LineItems
ON Orders.OrderID = LineItems.OrderID
Ich möchte den einzelnen Artikel in der Bestellung anzeigen. Aber mit dieser gelegentlichen um zwei , die (oder mehr) Einzelteile, würden die Aufträge erscheinen werden dupliziert :
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 spurving bearing
KSG-0619-81 5 panametric fan
KSG-0619-81 5 differential girdlespring
Was ich wirklich möchte, ist, dass SQL Server nur einen auswählt , da dies gut genug ist :
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 differential girdlespring
KSG-0619-81 5 panametric fan
Wenn ich abenteuerlustig werde, zeige ich dem Benutzer möglicherweise ein Auslassungszeichen, um anzuzeigen, dass es mehr als eines gibt:
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 differential girdlespring
KSG-0619-81 5 panametric fan, ...
Die Frage ist also, wie es geht
- Beseitigen Sie "doppelte" Zeilen
- Verbinden Sie sich nur mit einer der Zeilen, um Doppelarbeit zu vermeiden
Erster Versuch
Mein erster naiver Versuch war, mich nur den Werbebuchungen " TOP 1 " anzuschließen :
SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
INNER JOIN (
SELECT TOP 1 LineItems.Quantity, LineItems.Description
FROM LineItems
WHERE LineItems.OrderID = Orders.OrderID) LineItems2
ON 1=1
Aber das gibt den Fehler:
Die Spalte oder das Präfix 'Bestellungen' stimmt nicht
mit einem
in der Abfrage verwendeten Tabellennamen oder Aliasnamen überein .
Vermutlich, weil die innere Auswahl die äußere Tabelle nicht sieht.
group by
, dass alle anderen Spalten aufgelistet werden müssen, mit Ausnahme derjenigen, in der Sie keine Duplikate möchten. Quelle
group by
?