使用 Case 语句更新查询

问题描述 投票:0回答:1

有一个表 T1,其中包含列 Key 和 Value。键和值的组合为主键,并且组合是唯一的。

钥匙 价值
xyz 123
xyz 456
xyz 890
abc 123
abc 135
abc 204
lmn 890
890

编写一个更新查询,将所有值 890 更新为 123。但是在更新时,如果它破坏了唯一性(在本例中为键值“xyz”),则将该值设置为 890 本身或 -1。有很多这样的值需要用其他值替换。所以,请给我更新查询。

我尝试使用 case 语句进行更新查询,但它抛出错误:

UPDATE T1
SET Value = CASE 
                WHEN Value = 123 THEN 890
                WHEN Value = 450 THEN 222
                ELSE Value
            END;

错误:

违反主键约束。无法在对象中插入重复的键。重复的键值对象是 (xyz, 123)

sql sql-server sql-update
1个回答
0
投票
--Find duplicates and rows to update
WITH a AS (
SELECT T1.[KEY], 
      t1.[Value], 
      CASE t1.[Value] 
         WHEN 890 THEN 123 
         WHEN 450 THEN 222
         ELSE [Value] 
      END as NewValue,
      CASE t1.[Value] 
         WHEN 890 THEN 'Update' 
         WHEN 450 THEN 'Update'
         ELSE 'No Change' 
      END as Action
FROM T1
) 
SELECT t1.[KEY], STRING_AGG(t1.[VALUE],',') as T1Value, a.NewValue, Count(*) as KeyValueCount,
  CASE 
  WHEN count(*) > 1 THEN 'Duplicate'  
  ELSE
    min(a.Action)
  END AS Action
INTO #temp    
FROM 
T1
INNER JOIN a ON a.[Value]=t1.[Value] AND a.[Key]=T1.[Key]
GROUP BY t1.[KEY], a.NewValue;

--Update the table T1
UPDATE T1
SET  T1.[Value]=#Temp.[NewValue]
FROM T1
INNER JOIN #Temp on #Temp.[Key]=T1.[Key] 
      AND #Temp.[T1Value]=T1.[Value]
WHERE
     #Temp.Action='Update'

小提琴

钥匙 价值
xyz 123
xyz 456
xyz 890
abc 123
vabc 135
abc 204
lmn 123
123
© www.soinside.com 2019 - 2024. All rights reserved.