Я использую конкретный, но гипотетический пример.
В каждом заказе обычно есть только одна позиция:
Заказы:
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 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
? - person Dariush Jafari   schedule 11.04.2017group by
потребует перечислить все остальные столбцы, за исключением того, где вам не нужны дубликаты. Источник - person Joshua Nelson   schedule 01.06.2018