SQL Update列并忽略重复键错误

时间:2014-11-06 14:58:38

标签: sql sql-server

我希望更新同一行中其他列的连续值的列。我正在更新的列是唯一的,并且具有这种性质,我有时会遇到重复的键错误。我希望忽略这些错误,只是更新其中一个记录而忽略其他记录。

我的查询看起来像这样:

update [Table] set Coolname = lower(Fname) + lower(Lname)
where Coolname like '%s' 
and staticID=1995
and Fname is not null 
and Lname is not null

现在,在Fname和Lname匹配两行的情况下,我想只更新Coolname的第一条记录。

感谢。 (MS SQL Server)

2 个答案:

答案 0 :(得分:0)

这样的事情怎么样:

UPDATE[Table] 
SET Coolname = lower(Fname) + lower(Lname)
WHERE 'PRIMARY_KEY' IN 
    (SELECT top 1 'PRIMARY_KEY' FROM [Table] 
        WHERE Coolname LIKE'%s' 
        AND staticID=1995
        AND Fname IS NOT NULL 
        AND Lname IS NOT NULL );

没有SQL-Server的经验所以查询应该只是一个提示......希望我做对了。

答案 1 :(得分:0)

您应该可以使用几个CTE:

;With CoolNames as (
    select *,lower(Fname) + lower(Lname) as NewCoolName from Table
    where Coolname like '%s' 
    and staticID=1995
    and Fname is not null 
    and Lname is not null
), Ordered as (
    select *,ROW_NUMBER() OVER (PARTITION BY NewCoolName ORDER BY staticID) as rn
    from Coolnames cn
)
UPDATE Ordered SET CoolName = NewCoolName where rn = 1

在哪里,因为你不关心哪一个被选中进行更新,我选择了ORDER BY staticID - 我碰巧知道所有行都是一样的,所以这真的会让服务器任意选择一个进行更新。

如果发生了冲突,请不要在您的问题中提到两行符合更新条件的行,而是在有资格更新的行和现有行{{{已设置1}},然后添加

CoolName

进入WHERE NOT EXISTS(select * from Table t where t.CoolName = cn.CoolName) CTE。