Я буду использовать конкретный, но гипотетический пример.
Каждый Заказ обычно имеет только одну позицию:
Заказы:
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
Но иногда будет заказ с двумя позициями:
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 differential girdlespring
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
Но это дает ошибку:
В столбце или префиксе "Заказы" нет совпадение с именем таблицы или псевдонимом используется в запросе.
Предположительно, потому что внутренний выбор не видит внешнюю таблицу.