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

时间:2017-01-17 17:19:20

标签: sql sql-server stored-procedures

首先,我对SQL脚本的熟练程度不高,但我已经完成了一项任务,我希望得到一些指导/帮助来创建这个程序,谢谢你。

需要做的是,从表1中获取每个客户的重复项(table1具有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

SELECT t1.*
FROM table1 t1
INNER JOIN
     (SELECT [Name]
      FROM table1
      GROUP BY t1. [Name]
      HAVING COUNT(*) > 1) t2 ON t1.Name = t2.Name
ORDER BY t1.Customer, t1.Name

之后,必须与table2交叉引用这些重复项的ID,并从table2中获取相应的ID(Id2)。

我认为这部分应该由某种数组来完成,以存储ID或临时表

应删除table1中的重复项,其名称对应于预定列表且id3不为NULL

这样的东西
DELETE FROM table1 
WHERE Name IN ('name1', 'name2'.......)
  AND id3 IS NOT NULL

与每个客户的所有其他重复项一起(每个副本只留下第一个条目)。

2 个答案:

答案 0 :(得分:0)

在澄清问题之前,我首先使用 common table expression row_number() 开始:

;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;

答案 1 :(得分:0)

您应该能够使用公用表表达式删除任何重复记录。这将对每个重复进行编号,这将允许您删除除第一个之外的所有副本。您应该能够根据需要修改此代码。我会在删除任何内容之前先从 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