如何合并矩阵表中的结果集?

时间:2017-08-08 12:18:40

标签: sql

假设我有一个如下所示的价格矩阵:

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时,使用子查询的性能非常糟糕。不是说完全没用。

有没有一种有效的方法来实现我想要的东西?

1 个答案:

答案 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,为所有产品评估它们