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

Sql 如何合并矩阵表中的结果集?,sql,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 CostPri

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

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

有没有一种有效的方法来实现我所追求的目标

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的子选择移动到联接,以便对所有产品进行一次评估


将带有ORDER BY的子选择移动到联接,以便对所有产品进行一次评估

这实际上执行速度加快了1瑞典克朗:

SELECT ProductTable.ProdNo,

(SELECT MIN(salePrice)
           FROM PriceMatrix
           WHERE PriceMatrix.ID = ProductTable.ID 
           AND PriceMatrix.CostPrice = 0 
           AND PriceMatrix.SalePrice > 0) AS SalePrice,

(SELECT MIN(costPrice)
           FROM PriceMatrix
           WHERE PriceMatrix.ID = ProductTable.ID 
           AND PriceMatrix.CostPrice > 0 
           AND PriceMatrix.SalePrice = 0) AS CostPrice

FROM ProductTable

事实证明,执行速度提高了1瑞典克朗:

SELECT ProductTable.ProdNo,

(SELECT MIN(salePrice)
           FROM PriceMatrix
           WHERE PriceMatrix.ID = ProductTable.ID 
           AND PriceMatrix.CostPrice = 0 
           AND PriceMatrix.SalePrice > 0) AS SalePrice,

(SELECT MIN(costPrice)
           FROM PriceMatrix
           WHERE PriceMatrix.ID = ProductTable.ID 
           AND PriceMatrix.CostPrice > 0 
           AND PriceMatrix.SalePrice = 0) AS CostPrice

FROM ProductTable

就这样@斯坦尼斯拉夫特就是这样@斯坦尼斯拉夫