有一个表 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)
--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 |