使用 sql 删除 oracle 中的重复数据失败
Deletting duplicate data on oracle using sql failed
我有一个 table abc
作为:
acc subgroup
720V A
720V A
720V A
720V A
111 C
222 D
333 E
我的预期输出是:
acc subgroup
720V A
111 C
222 D
333 E
因为 720V A
是重复的,所以我想删除所有三个重复数据,并且只想要 table 中的一个数据。
所以,我尝试了
DELETE FROM (
select t.*,rownum rn from abc t where acc='720V') where rn>1;
所以,我得到的错误是:
ORA-01732: data manipulation operation not legal on this view
如何获得预期的输出?
你的table好像少了一个主键列,这是个大问题。假设实际上 是 主键列 PK
,我们可以尝试使用 ROW_NUMBER
来识别任何 "duplictes":
DELETE
FROM abc t1
WHERE pk IN (SELECT pk
FROM (
SELECT t.pk, ROW_NUMBER() OVER (PARTITION BY acc, subgroup ORDER BY pk) rn
FROM abc t) x
WHERE rn > 1
);
请注意,如果您可以忍受保留原始数据,那么最权宜之计可能是创建一个独特的视图:
CREATE VIEW abc_view AS
SELECT DISTINCT acc, subgroup
FROM abc;
我有一个 table abc
作为:
acc subgroup
720V A
720V A
720V A
720V A
111 C
222 D
333 E
我的预期输出是:
acc subgroup
720V A
111 C
222 D
333 E
因为 720V A
是重复的,所以我想删除所有三个重复数据,并且只想要 table 中的一个数据。
所以,我尝试了
DELETE FROM (
select t.*,rownum rn from abc t where acc='720V') where rn>1;
所以,我得到的错误是:
ORA-01732: data manipulation operation not legal on this view
如何获得预期的输出?
你的table好像少了一个主键列,这是个大问题。假设实际上 是 主键列 PK
,我们可以尝试使用 ROW_NUMBER
来识别任何 "duplictes":
DELETE
FROM abc t1
WHERE pk IN (SELECT pk
FROM (
SELECT t.pk, ROW_NUMBER() OVER (PARTITION BY acc, subgroup ORDER BY pk) rn
FROM abc t) x
WHERE rn > 1
);
请注意,如果您可以忍受保留原始数据,那么最权宜之计可能是创建一个独特的视图:
CREATE VIEW abc_view AS
SELECT DISTINCT acc, subgroup
FROM abc;