表名和列名含糊不清,因为我从事医疗保健行业,无法分享具体细节。如果客户从我的公司(表 1)而不是他们当前的供应商(表 2)购买产品,我正在使用此查询向他们显示节省的金额。
我在 MSQL Server 2008 上有 2 个这样的表:
Table 1
ProductID
, Description
, Vendor
,Price
Table 2
ProductID
, Description
,Price
我想从中选择每一行Table 2
并从中选择匹配的数据Table 1
。但我只想从 中以最优惠的价格(供应商中最低的价格)退回供应商Table 1
,而不是每个供应商。因此,对于任何ProductID
inTable 2
都应该有一个匹配 from ,或者如果inTable1
没有匹配,则为 NULL 值。我加入了表格并返回了我想要的所有列,但我无法将其限制为表 1 中的一个结果。如果我在 1000 行中执行此操作,我应该返回 1000 行。我不断地从多个供应商匹配中获得一些额外的结果。ProductID
Table 1
ProductID
Table 2
结果应如下所示:
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
D. Stanley 的这个回答奏效了;稍作更改以选择价格最低的每一行。
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