2017-04-16 71 views
0

这里是删除重复的行具有空

Id Name Value col1 col2 col3 
1 test1 1 null null null 
2 test1 1 x null null 
3 test1 1 x y null 
4 test2 2 x y z 
5 test2 2 x y null 

找到重复的基础上“名称”和“值”列,并删除其在多个列空值的一个数据。

我设法通过以下http://www.dba-oracle.com/t_delete_duplicate_table_rows.htm#null但凭着知道应该做什么在SQL

预期结果

ID Name Value col1 Col2 Col3 
3 test1 1 X  y null 
4 test2 2 x  y z 
+1

是否有三列?或者这只是一个例子? –

+0

@WillemVanOnsem有10多个,我已经把3例如 – Pat

回答

1

甲骨文设置实现这个删除重复:

CREATE TABLE table_name (Id, Name, Value, col1, col2, col3) AS 
SELECT 1, 'test1', 1, null, null, null FROM DUAL UNION ALL 
SELECT 2, 'test1', 1, 'x', null, null FROM DUAL UNION ALL 
SELECT 3, 'test1', 1, 'x', 'y', null FROM DUAL UNION ALL 
SELECT 4, 'test2', 2, 'x', 'y', 'z' FROM DUAL UNION ALL 
SELECT 5, 'test2', 2, 'x', 'y', null FROM DUAL; 

查询

SELECT * 
FROM (
    SELECT t.*, 
     ROW_NUMBER() OVER (
      PARTITION BY name, value 
      ORDER BY DECODE(col1, NULL, 0, 1) 
         + DECODE(col2, NULL, 0, 1) 
         + DECODE(col3, NULL, 0, 1) DESC, 
        col1, col2, col3 
     ) AS rn 
    FROM table_name t 
) 
WHERE rn = 1; 

输出

 ID NAME  VALUE C C C   RN 
---------- ----- ---------- - - - ---------- 
     3 test1   1 x y   1 
     4 test2   2 x y z   1