T-SQL-使用来自同一表的数据更新表-歧义表

时间:2018-06-28 18:11:23

标签: sql-server tsql

我无法理解为什么该查询无法正常工作。我收到一条消息

  

表“ #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

任何帮助将不胜感激!

谢谢

3 个答案:

答案 0 :(得分:1)

出现歧义是因为FROM的{​​{1}}子句两次引用了UPDATE表,因此SQL Server无法知道要更新的二者中的哪一个。要解决歧义,请使用#PriceChangesUPDATE #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;
相关问题