当前位置: 代码迷 >> Sql Server >> 过滤数据的SQL
  详细解决方案

过滤数据的SQL

热度:44   发布时间:2016-04-24 09:53:24.0
求一个过滤数据的SQL
由于错误操作,造成 A表中一部分数据重复(除了主键ID外,其他字段都相同),现在需要重复的数据只保留一笔
还有一个情况是 A表的主键和B表有外键关联 (A.id = B.fid), 那会有3种情况

1. A表重复数据 都 在B表中有关联-> 删除A.id较大的一个
2. A表重复数据  在B表中都没有关联-> 删除A.id较大的一个
3.A表重复数据 有一笔 在B表中有关联-> 删除A表中没有关联的哪一个


以上
感谢

------解决思路----------------------


DECLARE @a TABLE(id INT,c1 VARCHAR(10))

INSERT INTO @a SELECT 1,'a' UNION ALL 
SELECT 2,'a' UNION ALL 
SELECT 3,'a' UNION ALL 
SELECT 4,'b' UNION ALL 
SELECT 5,'b' UNION ALL
SELECT 6,'c' UNION ALL 
SELECT 7,'c';

DECLARE @b TABLE(fid int)
INSERT INTO @b(fid) VALUES(2),(4),(5);

DELETE FROM @a WHERE id NOT IN (
SELECT MIN(id) AS id FROM  @a WHERE id IN (SELECT fid FROM @b)
GROUP BY c1
UNION ALL 
SELECT MIN(id) FROM @a a WHERE NOT EXISTS(SELECT 1 FROM @a x WHERE a.c1=x.c1 AND x.id IN (SELECT fid FROM @b))
GROUP BY a.c1
);
SELECT * FROM @a;

/*
id          c1
----------- ----------
2           a
4           b
6           c
*/

------解决思路----------------------

 
  begin tran
  delete a 
  where id not in  (select id from 
  (select a.id,b.fid as id1 , name,a.address ,ROW_NUMBER()over(PARTITION by name,address order by 
   b.fid desc ,a.id desc ) as n from a left join b on a.id=b.fid) as t
   where n=1 )
     select * from a
id          name address
----------- ---- -------
2           zs   aaa
4           sm   bbb
6           lr   ccc
7           ms   ddd
8           xd   eee

(5 行受影响)


--结果

  
  相关解决方案