SQL Update跳过重复项

时间:2013-11-08 17:07:33

标签: sql sql-server distinct

表1如下所示。

ID  SIZE    TYPE      SERIAL
1    4      W-meter1  123456
2    5      W-meter2  123456
3    4      W-meter   585858
4    4      W-Meter   398574

如你所见。第1项和第2项都具有相同的序列号。我有一个innerjoin更新语句,它将基于将序列号链接到列表来更新这些设备上的UniqueID。

我想做什么。手动修改具有重复序列号的项目并编写脚本更新唯一的项目。我假设我必须在这里引用不同的命令,购买不确定。

这是我的更新声明。非常简单直接。

update UM00400

Set um00400.umEquipmentID = tb2.MIUNo

from UM00400 tb1


inner join AA_Meters tb2 on
tb1.umSerialNumber = tb2.Old_Serial_Num
where tb1.umSerialNumber  <> tb2.New_Serial_Num

2 个答案:

答案 0 :(得分:0)

;WITH CTE
AS
(
    SELECT * , rn = ROW_NUMBER() OVER (PARTITION BY SERIAL ORDER BY SERIAL)
    FROM UM00400
)
UPDATE CTE
SET CTE.umEquipmentID = tb2.MIUNo
inner join AA_Meters tb2 
on CTE.umSerialNumber = tb2.Old_Serial_Num
where tb1.umSerialNumber  <> tb2.New_Serial_Num
AND CTE.rn = 1

这将使用相同的SERIAL更新多条记录的第一条记录。

答案 1 :(得分:0)

如果我在下面正确理解您的问题,查询会帮助您:

;WITH CTE AS
(
// getting those serial numbers which are not duplicated

SELECT umSerialNumber,COUNT(umSerialNumber) as CountOfSerialNumber
FROM UM00400 
GROUP BY umSerialNumber
HAVING COUNT(umSerialNumber) = 1
)

UPDATE A SET A.umEquipmentID = C.MIUNo
FROM UM00400 A 
INNER JOIN CTE B ON A.umSerialNumber = B.umSerialNumber
INNER JOIN AA_Meters C ON A.umSerialNumber = C.Old_Serial_Num