Я буду использовать конкретный, но гипотетический пример.
Каждый заказ обычно имеет только одну позицию :
Заказы:
OrderGUID OrderNumber
========= ============
{FFB2...} STL-7442-1
{3EC6...} MPT-9931-8A
Позиции:
LineItemGUID Order ID Quantity Description
============ ======== ======== =================================
{098FBE3...} 1 7 prefabulated amulite
{1609B09...} 2 32 spurving bearing
Но иногда будет заказ с двумя позициями:
LineItemID Order ID Quantity Description
========== ======== ======== =================================
{A58A1...} 6,784,329 5 pentametric fan
{0E9BC...} 6,784,329 5 differential girdlespring
Обычно при отображении заказов пользователю:
SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
INNER JOIN LineItems
ON Orders.OrderID = LineItems.OrderID
Я хочу показать один элемент в заказе. Но с этим время от времени заказа , содержащие два (или более) элементов, заказы будут появляться быть продублированы :
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
Я действительно хочу, чтобы SQL Server просто выбрал один , так как он будет достаточно хорош :
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 differential girdlespring
KSG-0619-81 5 panametric fan
Если я предприму приключение, я мог бы показать пользователю многоточие, чтобы указать, что их больше одного:
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 differential girdlespring
KSG-0619-81 5 panametric fan, ...
Так что вопрос в том, как
- устранить "дублирующиеся" строки
- только присоединиться к одной из строк, чтобы избежать дублирования
Первая попытка
Моей первой наивной попыткой было присоединиться только к позициям " TOP 1 ":
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
Но это дает ошибку:
Столбец или префикс «Заказы» не
совпадает с именем таблицы или псевдонимом,
используемым в запросе.
Предположительно, потому что внутренний выбор не видит внешнюю таблицу.
group by
, потребуется перечислить все остальные столбцы, за исключением того, где вы не хотите дубликатов. Источник
group by
?