更改SQL表中的重复ID

时间:2017-10-10 21:05:09

标签: sql sql-server

我在列中应该是唯一的重复ID。我想运行更新查询以仅编辑ID的第二次出现并非全部。

例如 - 如果我运行它:

SELECT *
FROM [dbo].[Time_Frame]
WHERE [Respondent ID: Respondent] = 283028

我明白了:

受访者ID:受访者年份

  • 283028,2013,2013年第1季度

  • 283028,2015,2015年第3季度

如何编辑第二行ID,从283028到28302899,以便我可以确保我的表中仍有相同的行数,但所有ID都是唯一的?

我的表中有837个重复项。当我尝试更新时,它将更新1674行,而不仅仅是重复ID的837行。

提前感谢您提供给我的任何帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用可更新的CTE执行此操作:

with toupdate as (
      select tf.*,
             row_number() over (partition by [Respondent ID: Respondent] order by year, quarter) as seqnum
      from [dbo].[Time_Frame] tf
     )
update toupdate
    set [Respondent ID: Respondent] = [Respondent ID: Respondent]*1000 + seqnum
    where seqnum > 1;

这比你的方法更通用。它枚举重复键,结果是键是唯一的(假设每个键不超过998个重复项)。

答案 1 :(得分:0)

我认为以下查询应该有效。

            CREATE TABLE TIME_FRAME 

            (
            ID INT ,
            YEAR INT ,
            QTR VARCHAR(100) 
            )


            INSERT INTO TIME_FRAME 
            SELECT 283028,2013,'Q1 2013'
            INSERT INTO TIME_FRAME 
            SELECT 283028,2015,'Q3 2015'
            INSERT INTO TIME_FRAME 
            SELECT 283029,2013,'Q1 2013'
            INSERT INTO TIME_FRAME 
            SELECT 283029,2015,'Q3 2015'
            INSERT INTO TIME_FRAME 
            SELECT 283030,2013,'Q1 2013'
            INSERT INTO TIME_FRAME 
            SELECT 283030,2015,'Q3 2015'

            CREATE TABLE #TEMP 
            (
            TEMPID INT IDENTITY(1,1),
            ID INT ,
            YEAR INT ,
            QTR VARCHAR(100) 

            )


            INSERT INTO #TEMP(ID , YEAR,QTR) 
            SELECT * FROM TIME_FRAME


            BEGIN TRAN 

            UPDATE T 
            SET T.ID = TT.ID*100 -1 
            FROM TIME_FRAME T
            JOIN #TEMP TT 
            ON T.ID = TT.ID 
            AND T.QTR = TT.QTR
            AND T.YEAR = TT.YEAR
            AND TT.TEMPID IN (SELECT MAX(TEMPID) FROM #TEMP
            GROUP BY ID)

            SELECT * FROM TIME_FRAME

            --ROLLBACK TRAN