В таких случаях я часто использую устройство, которое я здесь применяю к вашему примеру и описываю ниже:
SELECT
i.[Invoice Number],
c.[Carrier Name]
FROM Invoice i
INNER JOIN Carriers c ON i.InvoiceKey = c.InvoiceKey
INNER JOIN (
SELECT MIN(ID) AS ID
FROM Carriers
GROUP BY InvoiceKey
) c_top ON c.ID = c_top.ID
Я думаю, это примерно то, что опубликовал Quassnoi, только я стараюсь избегать использования SELECT TOPS подобным образом.
Invoice
объединяется с Carriers
на основе выражения их связывания (в данном случае InvoiceKey
). Теперь Carriers
может иметь несколько строк для одного и того же InvoiceKey
, поэтому нам нужно ограничить вывод. И это делается с использованием производной таблицы.
Производная таблица группирует строки из Carrier на основе того же выражения, которое используется для связи двух таблиц (InvoiceKey
).
И есть другой способ: вместо соединения с производной таблицей вы можете использовать IN (subquery)
с тем же эффектом. Таким образом, полный запрос будет выглядеть так:
SELECT
i.[Invoice Number],
c.[Carrier Name]
FROM Invoice i
INNER JOIN Carriers c ON i.InvoiceKey = c.InvoiceKey
AND c.ID IN (SELECT MIN(ID) FROM Carriers GROUP BY InvoiceKey)