我无法理解为什么该查询无法正常工作。我收到一条消息
表“ #PriceChanges”不明确
下划线提到的#PriceChanges
UPDATE #PriceChanges
SET MaxQty = MIN(ISNULL(PT.MinQty, 100000000))
FROM #PriceChanges P
LEFT JOIN #PriceChanges PT ON P.ChangeType = PT.ChangeType
AND P.ItemNo = PT.ItemNo
AND P.MinQty < PT.MinQty
所以我想要实现的是将给定行的最大数量设置为在同一表中找到的下一个最小数量。如果没有找到,那就把它设为一个高得离谱的数字(100,000,000)
最终结果应该像这样
MinQty MaxQty
-----------------
0 20
20 50
50 100
100 100000000
任何帮助将不胜感激!
谢谢
答案 0 :(得分:1)
出现歧义是因为FROM
的{{1}}子句两次引用了UPDATE
表,因此SQL Server无法知道要更新的二者中的哪一个。要解决歧义,请使用#PriceChanges
或UPDATE #PriceChanges
而不是写UPDATE P
。这是一个简单的示例:
UPDATE PT
答案 1 :(得分:0)
创建一个中间表是可行的,我仍然想知道为什么不能全部将其放在一个更新中
SELECT P.ChangeType, P.ItemNo, P.MinQty, MIN(PT.MinQty) AS MaxQty
INTO #MaxQty
FROM #PriceChanges P
LEFT JOIN #PriceChanges PT
ON P.ChangeType = PT.ChangeType
AND P.ItemNo = PT.ItemNo
AND P.MinQty < PT.MinQty
GROUP BY P.ChangeType, P.ItemNo, P.MinQty
UPDATE #PriceChanges
SET MaxQty = ISNULL(PM.MaxQty, 100000000)
FROM #PriceChanges P
LEFT JOIN #MaxQty PM
ON P.ChangeType = PM.ChangeType
AND P.ItemNo = PM.ItemNo
AND P.MinQty = PM.MinQty
答案 2 :(得分:-1)
我认为ISNULL(PT.MinQty, 100000000)
没有用。 MIN()
忽略NULL
个值。而且您不需要自我加入。可更新的CTE或子查询有效:
UPDATE pc
SET MaxQty = min_minqty
FROM (SELECT pc.*, MIN(pc.MinQty) OVER (PARTITION BY ItemNo, ChangeType) as min_minqty
FROM #PriceChanges pc
) pc
WHERE pc.MaxQty <> min_minqty;
编辑:
您似乎想要:
with pc as (
select pc.*,
lead(pc.MinQty) over (order by pc.MinQty) as next_MinQty
from #PriceChanges pc
)
update pc
set MaxQty = next_MinQty;