日期:2014-05-17  浏览次数:20959 次

怎么去除 sql重复(有点小奇葩,不信过来看看吧)
  

问题是这样的: 这个表有两个列:部门 A,上级部门 B; 如果 有一行数据是:部门 B,上级部门 A

出现 一行数据 B C ,另外 一组数据 C B,就该排除,依次类推.....

这个是个测试表,暂且不考虑,这种奇葩现象咯.

各位 求助攻,小弟 先谢了! sql 不行哈...



------解决方案--------------------

delete from table1 where id=(
select top 1 bid from
(
select count(*) count, a.id aid, b.id bid from table1 a join table1 b on a.id = b.pid and a.pid = b.id
)c
where count > 1);
/*id为部门 pid为上级部门*/
/*最好有个时间可以排序*/

三层就不行了,两层应该可以
------解决方案--------------------

DECLARE @t TABLE(dep VARCHAR(10),pardep VARCHAR(10));

INSERT INTO @t SELECT 'a','b'
UNION ALL SELECT 'b','c'
UNION ALL SELECT 'c','d'
UNION ALL SELECT 'b','a'
UNION ALL SELECT 'c','b'
UNION ALL SELECT 'd','c'
UNION ALL SELECT 'x','y'

;WITH c1 AS (
SELECT rn=ROW_NUMBER() OVER(ORDER BY GETDATE()),* FROM @T
)
SELECT * FROM (
SELECT a.*,b.rn AS rnx FROM c1 a JOIN c1 b ON a.dep=b.pardep AND a.pardep=b.dep
) x  WHERE rn<rnx
/*
rn                   dep        pardep     rnx
-------------------- ---------- ---------- --------------------
1                    a          b          4
2                    b          c          5
3                    c          d          6
*/

不是很精确,楼主多测试一下,因为这种重复的只能选择一个删除掉.
还有就是多层环的情况可能没有考虑的.比如
a  b
b  c 

c  a --其实这一行也是不应该的.

楼主头像不错.