Oracle:不存在不同值时如何删除重复行?
Oracle : How to delete duplicates rows when no distinct value exists?
我们有一个 table,其中有很多行重复(2 到 4 次)(每行的每一列都具有相同的值)。
table 有 4 列但没有主键。
那么如何删除重复的行呢?
Instance status updatetime name
-----------------------------------------------
gdt546 4 2016/02/13 10:13:18 basic
gdt546 4 2016/02/13 10:13:18 basic
ort87a 1 2016/02/16 19:09:43 High
ort87a 1 2016/02/16 19:09:43 High
ort87a 1 2016/02/16 19:09:43 High
已编辑:
输出应该是:
Instance status updatetime name
-----------------------------------------------
gdt546 4 2016/02/13 10:13:18 basic
ort87a 1 2016/02/16 19:09:43 High
假设 table 的名称是 TABLE_NAME
并且目的是删除重复行以便只保留其中一个,请找到以下查询:
DELETE FROM table_name A
WHERE A.ROWID > ANY (SELECT B.ROWID
FROM table_name B
WHERE A.INSTANCE = B.INSTANCE
AND A.status = B.status
AND A.updatetime = B.updatetime
AND A.name = B.name);
这里有一个基于解析函数 row_number() 的解决方案。这是您要删除的 table:
SQL> select * from test1;
INSTANCE|STATUS|UPDATETIME |NAME
--------+------+-------------------+--------
gdt546 | 4|2016-02-13 10:13:18|basic
gdt546 | 4|2016-02-13 10:13:18|basic
ort87a | 1|2016-02-16 19:09:43|High
ort87a | 1|2016-02-16 19:09:43|High
ort87a | 1|2016-02-16 19:09:43|High
这里您删除了行的重复数据:
SQL> select instance, status, updatetime, name from
( select row_number() over (partition by instance, status,
updatetime, name order by status) as rn, test1.* from test1 ) a
where a.rn = 1 ;
INSTANCE|STATUS|UPDATETIME |NAME
--------+------+-------------------+--------
gdt546 | 4|2016-02-13 10:13:18|basic
ort87a | 1|2016-02-16 19:09:43|High
我们有一个 table,其中有很多行重复(2 到 4 次)(每行的每一列都具有相同的值)。 table 有 4 列但没有主键。
那么如何删除重复的行呢?
Instance status updatetime name
-----------------------------------------------
gdt546 4 2016/02/13 10:13:18 basic
gdt546 4 2016/02/13 10:13:18 basic
ort87a 1 2016/02/16 19:09:43 High
ort87a 1 2016/02/16 19:09:43 High
ort87a 1 2016/02/16 19:09:43 High
已编辑:
输出应该是:
Instance status updatetime name
-----------------------------------------------
gdt546 4 2016/02/13 10:13:18 basic
ort87a 1 2016/02/16 19:09:43 High
假设 table 的名称是 TABLE_NAME
并且目的是删除重复行以便只保留其中一个,请找到以下查询:
DELETE FROM table_name A
WHERE A.ROWID > ANY (SELECT B.ROWID
FROM table_name B
WHERE A.INSTANCE = B.INSTANCE
AND A.status = B.status
AND A.updatetime = B.updatetime
AND A.name = B.name);
这里有一个基于解析函数 row_number() 的解决方案。这是您要删除的 table:
SQL> select * from test1;
INSTANCE|STATUS|UPDATETIME |NAME
--------+------+-------------------+--------
gdt546 | 4|2016-02-13 10:13:18|basic
gdt546 | 4|2016-02-13 10:13:18|basic
ort87a | 1|2016-02-16 19:09:43|High
ort87a | 1|2016-02-16 19:09:43|High
ort87a | 1|2016-02-16 19:09:43|High
这里您删除了行的重复数据:
SQL> select instance, status, updatetime, name from
( select row_number() over (partition by instance, status,
updatetime, name order by status) as rn, test1.* from test1 ) a
where a.rn = 1 ;
INSTANCE|STATUS|UPDATETIME |NAME
--------+------+-------------------+--------
gdt546 | 4|2016-02-13 10:13:18|basic
ort87a | 1|2016-02-16 19:09:43|High