Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 删除重复行的值为空_Sql_Oracle - Fatal编程技术网

Sql 删除重复行的值为空

Sql 删除重复行的值为空,sql,oracle,Sql,Oracle,这是数据 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 根据“名称”和“值”列查找重复项,并删除在更多列中具有空值的重复项 我通过以下方法成功地删除了重复项,但我不知道应该如何在SQL中实现这一点 预期

这是数据

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
根据“名称”和“值”列查找重复项,并删除在更多列中具有空值的重复项

我通过以下方法成功地删除了重复项,但我不知道应该如何在SQL中实现这一点

预期结果

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

Oracle安装程序

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
查询

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
输出

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

有三列吗?或者这仅仅是一个例子?@WillemVanOnsem有10多个,我举了3个为例