sql - 将查询转换为 View 或表值函数

标签 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

最佳答案

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。

关于sql - 将查询转换为 View 或表值函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7992389/

相关文章:

sql - 如何使用 PostgreSQL 删除 2 列的重复行?

sql-server - 在 Visual Studio 2017 中升级报表服务器项目时出错

asp.net - 当 session 状态设置为 Sql Server 时,使用什么序列化程序?我可以更改它吗?

sql - 如何在 T-SQL 中删除空格前的某些字符?

mysql - 如何使用参数化查询按名称搜索列?

python - 生成 SQL "IN"子句 : how to safely handle input + empty value lists?

c# - 安装了SQL Server(标准版)如何通过代码获取服务器名称

tsql - String.Format 类似于 T-SQL 中的功能吗?

tsql - Grails Project jdbc TSQL如何创建datetime2列

mysql - 如果任何特定列值已从上一个条目更改,我的 sql 语句将获取行