我在一个应该是唯一的列中有一个重复的ID。我想运行一个update查询,只编辑ID的第二次出现,而不是全部。
例如-如果我运行这个:
SELECT *
FROM [dbo].[Time_Frame]
WHERE [Respondent ID: Respondent] = 283028我明白了:
答辩人身份证:答辩人年度季度
如何只编辑第二行ID,比如从283028到28302899,以确保我的表中仍然有相同的行数,但所有ID都是唯一的?
我的桌子上有837个复印机。当我尝试更新时,它将更新1674行,而不仅仅是重复ID的837行。
谢谢你能给我的任何帮助!
发布于 2017-10-10 21:09:23
您可以使用可更新的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个重复)。
发布于 2017-10-11 08:20:08
我认为下面的查询应该有效。
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 https://stackoverflow.com/questions/46676017
复制相似问题