2017-04-16 69 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