用于删除重复项的SQL Server存储过程

用于删除重复项的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

首先,我对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, 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