首先,我对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
与每个客户的所有其他重复项一起(每个副本只留下第一个条目)。
答案 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