将查询转换为视图或表值函数

时间:2011-11-03 09:11:24

标签: sql sql-server tsql

我想为所有产品获得最便宜的产品变量。对于一个产品来说,这很容易,但是我无法为所有产品做好准备,而且我不想使用光标。

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

4 个答案:

答案 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

是提供结果的最简单的查询。