现在有一张userinfo表,其中各个字段除了id之外都可以为空,用户通过手工把两个excel中的数据添加到了表中,但是出现很多冗余数据,比如,表有五个字段,其中一条数据的五个字段都有值,另外一条有两个字段为空,其余三个字段和某条数据的对应字段相等,则第二条数据要删除,请问如何筛选这样的冗余数据?
------解决方案--------------------
把表结构给出来,很多人会给你写sql语句
------解决方案--------------------
筛选去重复
------解决方案--------------------
这话实在
------解决方案--------------------
------解决方案--------------------
楼主 你需要定义清除你这个表中的重复数据的含义
现在你的描述有点混乱和没有规则
------解决方案--------------------
偶弄出了个比较笨的方法,由于不知道3个字段或者4个字段为空的情况下需不需要删除,如果不需要你再改一下吧。
- SQL code
WITH T AS(SELECT '1' A,'2' B,'3' C,'4' D,'5' E FROM dual UNION ALLSELECT '21', '2', '3', '4', '5' FROM dual UNION ALL SELECT '1', '2', '3', NULL, NULL FROM dual UNION ALLSELECT '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) T2WHERE T1.ALLSTR <> T2.ALLSTR AND INSTR(T2.ALLSTR,T1.ALLSTR) = 1 ;
------解决方案--------------------
------解决方案--------------------
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 ALLSELECT '21', '2', '3', '4', '5' FROM dual UNION ALL SELECT '1', '2', '3', NULL, NULL FROM dual UNION ALLSELECT '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) T2WHERE T1.ALLSTR <> T2.ALLSTR AND REGEXP_LIKE(T2.ALLSTR,T1.ALLSTR) ;