我正在使用SQL Server Management Studio 2012.我有一个包含数千行数据的表。许多行都是重复的,我需要删除它们。每行都有一个唯一标识符[OwnerID]
,该标识符设置为标识规范,标识增量为1.对于每一行,重复项位于以下列中:[FirstName]
,[LastName]
和{{ 1}}。
所以我需要在这3列中删除具有重复值组合的行。删除后,是否有t-sql我可以写入重置身份规范
[CompanyName]
从第一行开始为1,并以1为增量为其余行分配值?
感谢您的帮助。
答案 0 :(得分:0)
以下是一种删除行的方法,使用row_number()
保留第一行:
with todelete as (
select t.*,
row_number() over (partition by firstname, lastname, companyname
order by ownerid) as seqnum
from t
)
delete from todelete
where seqnum = 1;
要重置ownerid,您还可以使用类似的想法:
with toupdate as (
select t.*, row_number() over (order by ownerid) as seqnum
from t
)
update toupdate
set ownerid = seqnum;
但是,你应该非常小心。在设计良好的数据库中,名为OwnerID
的字段将引用名为Owner.OwnerId
或Owner.Id
的表中的列。更改ID的值可能会对其他表产生影响。
答案 1 :(得分:0)
我尝试使用临时表SQL Fiddle:
SELECT
firstName, LastName, CompanyName, COUNT(*) thecount, MIN(ID) min_id
INTO #temp
FROM tab
GROUP BY firstName, LastName, CompanyName;
SELECT
a.id ID, b.min_id
INTO #temp1
FROM tab a, #temp b
WHERE a.firstName = b.FirstName
AND a.LastName = b.LastName
AND a.CompanyName = b.CompanyName
AND b.thecount > 1;
-- run this query on all referenced tables:
UPDATE tab2 SET tab2.ID = t.min_id
FROM tab2, #temp1 t
WHERE tab2.ID = t.ID;
DELETE t
FROM tab t, #temp1 a
WHERE t.id = a.id and a.id <> a.min_id;
答案 2 :(得分:0)
如果您要删除重复数据并保留一个值,请使用此逗号分隔多个列的逗号
删除a( select *,rn = row_number()over(由MemberId按FirstName顺序分区) 来自会员 ) 一个 其中rn> 1;