SQL Server: как присоединиться к первой строке - PullRequest
677 голосов
/ 11 января 2010

Я буду использовать конкретный, но гипотетический пример.

Каждый Заказ обычно имеет только одну позицию :

Заказы:

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

Но это дает ошибку:

Столбец или префикс 'Orders' не
совпадать с именем таблицы или псевдонимом
используется в запросе.

Предположительно, потому что внутренний выбор не видит внешнюю таблицу.

Ответы [ 11 ]

2 голосов
/ 15 февраля 2013

Попробовал крестик, хорошо работает, но занимает немного дольше. Скорректированы столбцы строк, чтобы иметь максимальное значение и добавлена ​​группа, которая сохраняла скорость и удаляла дополнительную запись.

Вот скорректированный запрос:

SELECT Orders.OrderNumber, max(LineItems.Quantity), max(LineItems.Description)
FROM Orders
    INNER JOIN LineItems 
    ON Orders.OrderID = LineItems.OrderID
Group by Orders.OrderNumber
...