根据多个列删除不同的行

时间:2013-01-21 01:00:00

标签: sql sql-server-2012

我正在使用SQL Server Management Studio 2012.我有一个包含数千行数据的表。许多行都是重复的,我需要删除它们。每行都有一个唯一标识符[OwnerID],该标识符设置为标识规范,标识增量为1.对于每一行,重复项位于以下列中:[FirstName][LastName]和{{ 1}}。

所以我需要在这3列中删除具有重复值组合的行。删除后,是否有t-sql我可以写入重置身份规范 [CompanyName]从第一行开始为1,并以1为增量为其余行分配值?

感谢您的帮助。

3 个答案:

答案 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.OwnerIdOwner.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;