用于删除重复项的SQL Server存储过程
首先,我对SQL脚本编写不是很精通,但我被分配了一项任务,我希望能得到一些关于创建此过程的指导/帮助,提前谢谢 需要做的是,从表1中为每个客户获取副本(表1有id和id3) 我认为这一部分应该是可行的用于删除重复项的SQL Server存储过程,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,首先,我对SQL脚本编写不是很精通,但我被分配了一项任务,我希望能得到一些关于创建此过程的指导/帮助,提前谢谢 需要做的是,从表1中为每个客户获取副本(表1有id和id3) 我认为这一部分应该是可行的 SELECT * FROM table1 t1 WHERE EXISTS (SELECT * FROM table1 t2 WHERE t1.name = t2.name AND t2.id IS NULL) ORDER BY Id, N
SELECT *
FROM table1 t1
WHERE EXISTS (SELECT *
FROM table1 t2
WHERE t1.name = t2.name AND t2.id IS NULL)
ORDER BY Id, Name
或
之后,这些副本的ID必须与表2交叉引用,并从表2中获得相应的ID(Id2)
我假设这部分应该通过某种数组来存储id或临时表
应删除表1中的重复项,其名称与预定列表对应,且id3不为空
差不多
DELETE FROM table1
WHERE Name IN ('name1', 'name2'.......)
AND id3 IS NOT NULL
连同每个客户的所有其他副本(每个副本只保留第一个条目)。在问题得到澄清之前,我首先使用版本:
;with cte as (
select *
, rn = row_number() over (
partition by name
order by isnull(id,2147483647), isnull(id3,0)
)
from table1 t1
--/*
where exists (
select 1
from table1 t2
where t1.name = t2.name
and t2.id is null
)
--*/
)
--/*
select *
from cte o
where exists (
select 1
from cte i
where i.name=o.name
and i.rn>1
);
--*/
--delete from cte where rn>1;
您应该能够使用公共表表达式删除任何重复记录。这将对每个副本进行编号,以便删除除第一个副本以外的所有副本。您应该能够根据需要修改此代码。我会先从CTE中选择,然后再删除任何内容来测试它
WITH CTE AS(
SELECT *, ROW_NUMBER()OVER(PARTITION BY col1, col2 ORDER BY col3) as row_num
FROM table1
where col4 = 'SOMETHING' //optional
)
--select * from CTE
--select * from CTE where row_num > 1
delete from CTE where row_num > 1
您可以添加一些示例数据吗?两个不同的客户不能有相同的名称吗?当然需要一些示例数据。是的,2个客户可以在表中相互比较使用相同的名称,但他们不应该在其条目中多次使用相同的名称。John Daydream John Daydream Peter Daydream Peter Daydream Peter Daydream Amber Fly_co Amber Fly_co Jackie Fly_co Jackie Fly_co Jackie Fly_co Jackie Fly_coHere是表1客户的一个例子| id1 id3----------------------John|白日梦|空约翰|白日梦| 5fasgw323543 | 2彼得|白日梦|空彼得|白日梦| fsfa4334gdfgdfg琥珀|飞|飞|飞|dsasdre4343hj4 Jackie | Fly|u co | NULL Jackie | Fly|u co | ewr4jgos4343hf
WITH CTE AS(
SELECT *, ROW_NUMBER()OVER(PARTITION BY col1, col2 ORDER BY col3) as row_num
FROM table1
where col4 = 'SOMETHING' //optional
)
--select * from CTE
--select * from CTE where row_num > 1
delete from CTE where row_num > 1