更新表集列=找到重复项的情况

时间:2019-07-31 05:23:41

标签: sql sql-server

我想更新表中的列,如果它可以在列Cownnum中找到重复的数字,则将其设置为加1;否则,如果未找到重复的数据,则将其设置为1

我尝试了下面的代码,但显示错误

  

Msg 512,第16级,状态1,第53行   子查询返回的值超过1。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。   该声明已终止。

update   dbo.temp1 set SEQNO = case SEQNO when (SELECT
    cownnum
FROM
    dbo.temp1
GROUP BY
    cownnum
HAVING 
    COUNT(*) > 1) then SEQNO = 2 else  SEQNO = 1 end 

例如结果将是

cownnum  1  1  2  3
SEQNO    1  2  1  1

5 个答案:

答案 0 :(得分:1)

您可以使用lag()来检查sqlserver中的上一行值

Update temp1
set temp1.SEQNO = B.SEQNO
FROM temp1 A, (select id , COWNNUM, 
     case when COWNNUM = lag(COWNNUM) over(order by id) 
     then ROW_NUMBER() OVER ( PARTITION BY COWNNUM ORDER BY id ) else 1 end as SEQNO 
     from temp1) B
WHERE A.id = B.id

DEMO

答案 1 :(得分:0)

您的问题令人困惑,但是没有理由使用GROUP BY子句:

    UPDATE dbo.temp1 SET SEQNO = 1 WHERE SEQNO = cownnum

或者也许您需要以某种方式检查cownnum

   UPDATE dbo.temp1 SET SEQNO = 1 WHERE cownnum = (SELECT TOP 1 xxx FROM table WHERE ???)

请提供您的数据和预期结果的示例。

答案 2 :(得分:0)

您可以使用ROW_NUMBER

UPDATE t1
SET t1.SEQNO = t2.rowno
FROM table_with_duplicates t1
    INNER JOIN
    (
        SELECT unique_id,
               ROW_NUMBER() OVER (PARTITION BY cownnum ORDER BY cownnum) AS rowno
        FROM table_with_duplicates
    ) t2
        ON t1.unique_id = t2.unique_id;

答案 3 :(得分:0)

满足您需求的完美解决方案是

UPDATE  @Temp1
SET     SEQNO = B.NewSEQ
FROM    @Temp1 A ,
        ( SELECT id,
            CASE WHEN COWNNUM = LAG(COWNNUM) OVER ( ORDER BY id ) THEN 
                ROW_NUMBER() OVER ( PARTITION BY COWNNUM ORDER BY id ) ELSE 1 END AS NewSEQ
        FROM    @temp1
        ) B
WHERE   A.id = B.id

您可以通过单击 DEMO

来检查此查询的执行情况

答案 4 :(得分:0)

您可以使用窗口功能。使用可更新的CTE最简单:

with toupdate as (
      select t.*,
             row_number() over (partition by cownum order by (select null)) as new_seqno
      from dbo.temp1 t
     )
update toupdate
    set seqno = new_seqno;

如果我正确理解了这个问题,则不需要join