我想为所有产品获得最便宜的产品变量。对于一个产品来说,这很容易,但是我无法为所有产品做好准备,而且我不想使用光标。
select top 1
pv.VariantID
from
ProductVariant pv
inner join (select min(price) as Price from productvariant where ProductID = @ProductID) pr
on pv.Price = pr.Price
where
pv.ProductID = @ProductID
如果2个表具有以下结构,则此方法有效:
Product - ProductID
ProductVariant - ProductID, VariantID, Price
我知道你可以这样做,有谁知道怎么做?
是将上面的查询转换为标量函数并使用它的最佳方法吗?所以它会变成:
select
ProductID
, dbo.NewFunction(ProductID)
from
Product
答案 0 :(得分:3)
SELECT ProductID, MIN(Price) MinPrice
FROM Product JOIN ProductVariant ON Product.ProductID = ProductVariant.ProductID
GROUP BY ProductID
这会让你获得最低价格。如果您想要随附的VariantID,那么您需要再次加入 - 但每个VariantID的价格是唯一的吗?
SELECT VariantID, ProductID, MinPrice
FROM ProductVariant JOIN
(SELECT ProductID, MIN(Price) MinPrice
FROM Product JOIN ProductVariant ON Product.ProductID = ProductVariant.ProductID
GROUP BY ProductID) min_price
ON ProductVariant.ProductID = min_price.ProductID AND ProductVariant.Price = min_price.MinPrice
如果每个变体的价格不是唯一的,这将无法正常工作 - 特别是您将获得重复。如果发生这种情况,您可以将其更改为:
SELECT MIN(VariantID) SmallestVariantID, ProductID, MinPrice
FROM ProductVariant JOIN
(SELECT ProductID, MIN(Price) MinPrice
FROM Product JOIN ProductVariant ON Product.ProductID = ProductVariant.ProductID
GROUP BY ProductID) min_price
ON ProductVariant.ProductID = min_price.ProductID AND ProductVariant.Price = min_price.MinPrice
GROUP BY ProductID, MinPrice
这将从重复项中选择最小的变体ID。
答案 1 :(得分:2)
select
pv.ProductID
, min(pv.VariantID)
from
ProductVariant pv
inner join (select min(price) as Price, ProductID from productvariant group by ProductID) pr
on pv.ProductID = pr.ProductID
and pr.Price = pv.Price
group by
pv.ProductID
这是我找到的最简单的解决方案。
答案 2 :(得分:1)
这样的东西?
select pv.VariantID
from ProductVariant pv1
join (select min(pv2.price) as Price from productvariant pv2 where pv2.ProductID = pv.ProductID) pr
on pv1.Price = pr.Price
答案 3 :(得分:0)
如果我理解正确,您有多个产品,每个产品都有自己的变体,每个变体都有自己的价格。
如果是这种情况,我想
select p.ProductID, min(pv.Price)
from Product
inner join ProductVariant pv on p.ProductID = pv.ProductID
是提供结果的最简单的查询。