我有一个查询,通过使用枚举 的分组(分区)中的行来返回Price
a 的最低值,按升序排序(MIN 函数在将列添加到 SELECT 后返回多行)。ProductVariation
ROW_NUMBER()
ProductId
Price
SELECT
pv.Id AS VariationId,
pv.ProductId,
pv.[Description],
pv.Price,
pv.Stock,
ROW_NUMBER() OVER (PARTITION BY pv.ProductId ORDER BY pv.Price, pv.Stock DESC) AS SortId
FROM ProductVariation pv
INNER JOIN Product p ON p.Id = pv.ProductId
WHERE p.CompanyId = @CompanyId
一种Product
可以有多种变体。下面是我的ProductVariation
桌子。
该查询运行完美并返回以下结果:
变体ID | 产品编号 | 描述 | 价格 | 库存 | 排序编号 |
---|---|---|---|---|---|
149 | 97 | 黄色水果 | 139.99 | 0.00 | 1 |
150 | 97 | 红色水果 | 139.99 | 5.00 | 2 |
151 | 97 | 青苹果 | 139.99 | 20:00 | 3 |
152 | 98 | 桃芒果 | 219.99 | 0.00 | 1 |
153 | 99 | 疯狂柠檬 | 169.99 | 1.00 | 1 |
154 | 99 | 北极冰 | 169.99 | 3.00 | 2 |
155 | 99 | 天堂冲床 | 169.99 | 3.00 | 3 |
然而,现在我们有另一个表,ProductValueConsultor
顾问可以在ProductVariation
其中单独更新价格。
在里面ProductValueConsultor
我们有一行将ProductVariation
id 149 的价格更新为 149.00 美元。
商店ID | 价格 | 产品变体 ID |
---|---|---|
13 | 149.90 | 149 |
所以现在,我更新了查询并添加了OUTER APPLY
运算符来识别ProductValueConsultor
表中可能的值并显示更新的价格。
SELECT
pv.Id AS VariationId,
pv.ProductId,
pv.[Description],
ISNULL(pValue.Price, pv.Price) Price,
pv.Stock,
ROW_NUMBER() OVER (PARTITION BY pv.ProductId ORDER BY pv.Price) AS SortId
FROM ProductVariation pv
OUTER APPLY (
SELECT TOP 1 * FROM ProductValueConsultor pvc
WHERE pv.Id = pvc.ProductVariationId AND pvc.StoreId = @StoreId
) pValue
INNER JOIN Product p ON p.Id = pv.ProductId
WHERE p.CompanyId = @CompanyId
操作OUTER APPLY
员工作完美,显示了 id 149 的更新价格。ProductVariation
但是,该ROW_NUMBER()
函数出现故障,显示原始价格的排序顺序。
变体ID | 产品编号 | 描述 | 价格 | 库存 | 排序编号 |
---|---|---|---|---|---|
149 | 97 | 黄色水果 | 149.99 | 0.00 | 1 |
150 | 97 | 红色水果 | 139.99 | 5.00 | 2 |
151 | 97 | 青苹果 | 139.99 | 20:00 | 3 |
152 | 98 | 桃芒果 | 219.99 | 0.00 | 1 |
153 | 99 | 疯狂柠檬 | 169.99 | 1.00 | 1 |
154 | 99 | 北极冰 | 169.99 | 3.00 | 2 |
155 | 99 | 天堂冲床 | 169.99 | 3.00 | 3 |
如何修复此查询以将ROW_NUMBER()
函数应用于更新的值OUTER APPLY
?
只需更改
ORDER BY
行号中的是
TOP (1)
可疑的,因为它没有ORDER BY
。假设ProductValueConsultor
实际上是一个多对多连接表,无论如何你应该总是只有一行,所以没有必要添加TOP (1)
. 否则添加一个ORDER BY
到APPLY