Sql 如何在Oracle中删除重复项?
我试图删除表中的重复行,但它给了我一个错误,即Sql 如何在Oracle中删除重复项?,sql,oracle,duplicates,sql-delete,Sql,Oracle,Duplicates,Sql Delete,我试图删除表中的重复行,但它给了我一个错误,即 SQL Error: ORA-01732: data manipulation operation not legal on this view 01732. 00000 - "data manipulation operation not legal on this view" *Cause: *Action: 以下是我的疑问: delete from ( SELECT A.*, row_number() over
SQL Error: ORA-01732: data manipulation operation not legal on this view
01732. 00000 - "data manipulation operation not legal on this view"
*Cause:
*Action:
以下是我的疑问:
delete from
(
SELECT A.*,
row_number() over (partition by x,y order by y) as dup
FROM table A
WHERE x='13' AND EXTRACT(YEAR FROM y)='2020'
) A
where dup>1
如果y是唯一的,则通常使用:
delete from a
where x = '13' and
y >= date '2020-01-01' and
y < date '2021-01-01' and
rowid > (select min(a2.y)
from a a2
where a2.x = a.x and a2.y >= date '2020-01-01' and y < date '2021-01-01'
);
如果y是唯一的,则通常使用:
delete from a
where x = '13' and
y >= date '2020-01-01' and
y < date '2021-01-01' and
rowid > (select min(a2.y)
from a a2
where a2.x = a.x and a2.y >= date '2020-01-01' and y < date '2021-01-01'
);
您可以选择要删除的rowid,然后使用in条件删除它们:
从表A中删除
其中rowid在选择rowid中
从中选择rowid,按x分区上的行数,y按y排序作为dup
表格A
式中,x='13'和从y开始的年份='2020'
其中dup>1
您可以选择要删除的rowid,然后使用in条件删除它们:
从表A中删除
其中rowid在选择rowid中
从中选择rowid,按x分区上的行数,y按y排序作为dup
表格A
式中,x='13'和从y开始的年份='2020'
其中dup>1
一种简单的方法是使用EXISTS,如下所示:
DELETE FROM TABLE_A A
WHERE A.X = '13'
AND A.Y >= TRUNC(SYSDATE,'YY') -- 01-01-2020
AND A.Y < TRUNC(ADD_MONTHS(SYSDATE,12),'YY') -- 01-01-2021
AND EXISTS (SELECT 1
FROM TABLE_A AA
WHERE AA.X = A.X
AND AA.Y = A.Y
AND AA.ROWID > A.ROWID);
一种简单的方法是使用EXISTS,如下所示:
DELETE FROM TABLE_A A
WHERE A.X = '13'
AND A.Y >= TRUNC(SYSDATE,'YY') -- 01-01-2020
AND A.Y < TRUNC(ADD_MONTHS(SYSDATE,12),'YY') -- 01-01-2021
AND EXISTS (SELECT 1
FROM TABLE_A AA
WHERE AA.X = A.X
AND AA.Y = A.Y
AND AA.ROWID > A.ROWID);
另一个标准模式是:
delete sometable
where rowid in (
( select lead(rowid) over (partition by y order by z) as dup
from sometable a
where x = '13'
and ... )
其中y是一个或多个重复的键,例如customer_id,z是一个ordering键。如果您在多天内创建了同一个客户,并且希望保留第一个并删除其余客户,则可以选择“first”或“last”行以保留例如created_date
您的示例的这一部分似乎没有意义:
(partition by x,y order by y)
因为每个分区中的所有对象都具有相同的x和y值。您可能希望按不属于分区键的内容进行订购。另一个标准模式是:
delete sometable
where rowid in (
( select lead(rowid) over (partition by y order by z) as dup
from sometable a
where x = '13'
and ... )
其中y是一个或多个重复的键,例如customer_id,z是一个ordering键。如果您在多天内创建了同一个客户,并且希望保留第一个并删除其余客户,则可以选择“first”或“last”行以保留例如created_date
您的示例的这一部分似乎没有意义:
(partition by x,y order by y)
因为每个分区中的所有对象都具有相同的x和y值。您可能希望按不属于分区键的内容排序。重复列还是指行?顺便说一句,如果这实际上是有效的,它将删除所有匹配的行,而不仅仅是重复的行。我想删除重复的行重复列,或者你是指行?顺便说一句,如果这实际上是有效的,它将删除所有匹配的行,而不仅仅是重复的行。我想删除重复的行