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
就这样@斯坦尼斯拉夫特就是这样@斯坦尼斯拉夫