假设我有一个如下所示的价格矩阵:
ID SalePrice CostPrice
1 200 0
1 0 75
1 0 100
2 150 0
2 0 50
2 500 0
然后我有一个75k ID的表,我希望与价格矩阵一起加入,并为每个ID返回一行,其中SalePrice和CostPrice的值最低。像这样:
ID SalePrice CostPrice
200 75
150 50
这是我目前使用的sql:
declare @priceMatrix TABLE(
prodNo varchar(50) NOT NULL,
salePrice decimal,
costPrice decimal)
INSERT INTO @priceMatrix
SELECT pm.ID, pm.SalePr, pm.CstPr
FROM PriceMatrix pm
GROUP BY pm.ID, pm.SalePrice, pm.CostPrice
ORDER BY pm.ID ASC
SELECT ProductTable.ProdNo,
(SELECT TOP 1 salePrice FROM @priceMatrix WHERE ProductTable.ID = ID AND
costPrice = 0 ORDER BY salePrice ASC) AS SalePrice ,
(SELECT TOP 1 costPrice FROM @priceMatrix WHERE ProductTable.ID = ID AND
salePrice = 0 ORDER BY costPrice ASC) AS CostPrice ,
FROM ProductTable
GROUP BY ProductTable.ID
但是使用75000 ID时,使用子查询的性能非常糟糕。不是说完全没用。
有没有一种有效的方法来实现我想要的东西?
答案 0 :(得分:0)
SELECT ProductTable.ProdNo,
sub1.MIN_SALE_PRICE as SalePrice ,
sub2.MIN_COST_PRICE as CostPrice
FROM ProductTable pt
LEFT JOIN (SELECT MIN(salePrice) MIN_SALE_PRICE, ID
FROM @priceMatrix
WHERE costPrice = 0
GROUP BY ID) sub1 ON pt.ID=sub1.ID
LEFT JOIN (SELECT MIN(costPrice ) MIN_COST_PRICE, ID
WHERE salePrice = 0
FROM @priceMatrix
GROUP BY ID) sub2 ON pt.ID=sub2.ID
GROUP BY ProductTable.ID
将带有ORDER BY的子选择移动到JOINS,为所有产品评估它们