Названия таблиц и столбцов расплывчаты, потому что я работаю в сфере здравоохранения и не могу поделиться конкретными подробностями. Я использую этот запрос, чтобы показать клиенту сумму экономии, если он купит продукт у моей компании (таблица 1), а не у своего текущего поставщика (таблица 2).
У меня есть две такие таблицы на MSQL Server 2008:
Table 1
ProductID
, Description
, Vendor
, Price
Table 2
ProductID
, Description
, Price
Я хочу выбрать каждую строку из Table 2
и соответствующие данные из Table 1
. Но я хочу вернуть только продавца с лучшей ценой (самая низкая цена среди продавцов) от Table 1
, а не каждого продавца. Таким образом, для любого ProductID
в Table 2
должно быть одно совпадение из Table1
или значение NULL, если нет совпадения ProductID
в Table 1
. Я присоединился к таблицам ProductID
и вернул все нужные столбцы, но не могу заставить его ограничиться только одним результатом из таблицы 1. Если я сделаю это с 1000 строками в Table 2
, я должен вернуть 1000 строк. Я продолжаю заканчивать с несколькими дополнительными совпадениями от нескольких поставщиков.
Результаты должны выглядеть следующим образом:
T1.ProductID, T1.Description, Vendor, T1.Price, T2.ProductID,
T2.Description, T2.Price, (T2.Price - T1.Price) as 'Amount Saved'
SQL, который я написал, довольно прост:
SELECT
T1.ProductID,
T1.Description,
Vendor,
T1.Price,
T2.ProductID,
T2.Description,
T2.Price,
(T2.Price - T1.Price) AS 'Amount Saved'
FROM
Table2 T2 LEFT OUTER JOIN Table1 T1
ON T2.ProductID = T1.ProductID
ORDER BY T2.ProductID
Этот ответ Д. Стэнли сработал; с небольшим изменением, чтобы выбрать каждую строку с самой низкой ценой.
SELECT
T1.ProductID,
T1.Description,
T1.Vendor,
T1.Price,
T2.ProductID,
T2.Description,
T2.Price,
(T1.Price - T2.Price) as 'Amount Saved'
FROM Table2 T2
LEFT JOIN (
SELECT * FROM (
SELECT ProductID, Description, Vendor, Price,
ROW_NUMBER() OVER (PARTITION BY ProductID ORDER BY Price ASC) AS Row
FROM Table1) as result
WHERE row=1
) AS T1
ON T2.ProductID = T1.ProductID