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值。您可能希望按不属于分区键的内容排序。

重复列还是指行?顺便说一句,如果这实际上是有效的,它将删除所有匹配的行,而不仅仅是重复的行。我想删除重复的行重复列,或者你是指行?顺便说一句,如果这实际上是有效的,它将删除所有匹配的行,而不仅仅是重复的行。我想删除重复的行