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

数据冗余问题!
现在有一张userinfo表,其中各个字段除了id之外都可以为空,用户通过手工把两个excel中的数据添加到了表中,但是出现很多冗余数据,比如,表有五个字段,其中一条数据的五个字段都有值,另外一条有两个字段为空,其余三个字段和某条数据的对应字段相等,则第二条数据要删除,请问如何筛选这样的冗余数据?

------解决方案--------------------
把表结构给出来,很多人会给你写sql语句
------解决方案--------------------
筛选去重复
------解决方案--------------------
这话实在
探讨
把表结构给出来,很多人会给你写sql语句

------解决方案--------------------
探讨
现在有一张userinfo表,其中各个字段除了id之外都可以为空,用户通过手工把两个excel中的数据添加到了表中,但是出现很多冗余数据,比如,表有五个字段,其中一条数据的五个字段都有值,另外一条有两个字段为空,其余三个字段和某条数据的对应字段相等,则第二条数据要删除,请问如何筛选这样的冗余数据?

------解决方案--------------------
楼主 你需要定义清除你这个表中的重复数据的含义

现在你的描述有点混乱和没有规则
------解决方案--------------------
偶弄出了个比较笨的方法,由于不知道3个字段或者4个字段为空的情况下需不需要删除,如果不需要你再改一下吧。
SQL code

WITH T AS(
SELECT '1' A,'2' B,'3' C,'4' D,'5' E FROM dual UNION ALL
SELECT '21', '2', '3', '4', '5' FROM dual UNION ALL 
SELECT '1', '2', '3', NULL, NULL FROM dual UNION ALL
SELECT '1', '2', NULL, NULL, NULL  FROM dual UNION ALL 
SELECT '2', '1', '3', '4', '5' FROM dual UNION ALL 
SELECT '2', '1', '3', '4', NULL FROM dual 
)

SELECT * FROM 
(SELECT '@'||RTRIM(NVL2(A,A,'')||'@'||NVL2(B,B,'')||'@'||NVL2(C,C,'')||'@'||NVL2(D,D,'')||'@'||NVL2(E,E,''),'@')||'@' ALLSTR,A,B,C,D,E FROM T) T1,
(SELECT '@'||RTRIM(NVL2(A,A,'')||'@'||NVL2(B,B,'')||'@'||NVL2(C,C,'')||'@'||NVL2(D,D,'')||'@'||NVL2(E,E,''),'@')||'@' ALLSTR FROM T) T2
WHERE T1.ALLSTR <> T2.ALLSTR AND
      INSTR(T2.ALLSTR,T1.ALLSTR) = 1 ;

------解决方案--------------------
探讨
我的表现在算上id一共20个字段,比较其中两条数据,如果对应的字段都相等就算冗余,还有一种情况是这两条数据都有可能存在空字段,如果两条数据对应的非空字段都相等,而其中一条数据的非空字段多于另一条,则非空字段少的那条即为冗余。不知道明白没有

------解决方案--------------------
7楼的代码有点小问题,不支持1, null, 3, null, null格式的数据,我改进了代码,不过代码中使用了正则表达式,需要oracle 10g以上版本才支持.
SQL code

WITH T AS(
SELECT '1' A,'2' B,'3' C,'4' D,'5' E FROM dual UNION ALL
SELECT '21', '2', '3', '4', '5' FROM dual UNION ALL 
SELECT '1', '2', '3', NULL, NULL FROM dual UNION ALL
SELECT '1', '2', NULL, NULL, NULL  FROM dual UNION ALL 
SELECT '1',  NULL, NULL, '4', NULL  FROM dual UNION ALL 
SELECT '2', '1', '3', '4', '5' FROM dual UNION ALL 
SELECT '2', '1', '3', '4', NULL FROM dual 
)

SELECT * FROM 
(SELECT '@'||RTRIM(NVL2(A,A,'(.*)')||'@'||NVL2(B,B,'(.*)')||'@'||NVL2(C,C,'(.*)')||'@'||NVL2(D,D,'(.*)')||'@'||NVL2(E,E,'(.*)'),'@')||'@' ALLSTR,A,B,C,D,E FROM T) T1,
(SELECT '@'||RTRIM(NVL2(A,A,'')||'@'||NVL2(B,B,'')||'@'||NVL2(C,C,'')||'@'||NVL2(D,D,'')||'@'||NVL2(E,E,''),'@')||'@' ALLSTR FROM T) T2
WHERE T1.ALLSTR <> T2.ALLSTR AND
      REGEXP_LIKE(T2.ALLSTR,T1.ALLSTR)  ;