【问题标题】:SQL Update column and ignore duplicate key errorsSQL 更新列并忽略重复键错误
【发布时间】:2014-11-06 23:49:59
【问题描述】:

我希望使用同一行中其他列的连接值更新一列。我正在更新的列是唯一的,并且这样做的性质有时会导致重复的键错误。我希望忽略这些错误,只需更新其中一条记录并忽略其他记录。

我的查询看起来像这样:

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 服务器)

【问题讨论】:

  • 忽略重复键错误并不是一个真正的好习惯......如果一个值存在一次或多次并不重要,很好,但不要将其声明为 primary_key 或唯一...... .
  • 明白了,这是一个相当独特的案例,但是是必需的。
  • 如何定义“第一条记录”?有什么钥匙吗?请记住,表格本身没有第一个或最后一个的概念
  • 理解 Sparky....first 是无关紧要的,我应该改写“one of”。只要只更新一条记录就可以了
  • 如果只是 Fname 和 Lname 的乘积,为什么还需要一个“Coolname”列?这可以通过视图来处理。只需将列定义为 SELECT LOWER(Fname) + LOWER(Lname) AS Coolname。

标签: sql sql-server


【解决方案1】:

这样的事情怎么样:

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 方面的经验,所以查询应该只是一个提示……希望我没看错。

【讨论】:

    【解决方案2】:

    您应该能够使用几个 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 - 我碰巧知道所有行都是一样的,所以这真的会让服务器任意选择一个进行更新。

    如果发生冲突,不是您在问题中提到的有资格更新的两行之间,而是在有资格更新的一行和 existing 行之间,@987654323 @已经设置,然后添加

    WHERE NOT EXISTS(select * from Table t where t.CoolName = cn.CoolName)
    

    进入Ordered CTE。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 2010-11-03
      • 1970-01-01
      • 2013-10-31
      • 2017-10-16
      • 2020-07-16
      相关资源
      最近更新 更多