Oracle根据条件删除重复项

时间:2019-10-21 11:48:19

标签: sql oracle duplicates

我试图从表中删除一些重复项,并尝试保留ID1列的重复项之一。

使用此查询,我设法根据ROWID进行删除。

.e { z-index: 3; }
.s { z-index: 2; }

现在,我要删除在NETAMT = 0时发现重复的所有那些记录

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以使用以下查询来实现:

delete from  tabela.lorik O
where O.netamt = 0 
AND EXISTS (SELECT 1 FROM tabela.lorik I
WHERE I.ID = O.ID AND I.netamt <> 0)

我假设您只需要删除netamount = 0处的记录,否则请在下面做注释。

如果您要保留一个非零条目并删除所有其他条目(对于全零,将保留一个以netamount为零的条目),则可以使用以下查询:

DELETE FROM TABELA.LORIK O
WHERE
    ROWID IN (
        SELECT
            RWID
        FROM
            (
                SELECT
                    ROWID AS RWID,
                    ROW_NUMBER() OVER(
                        PARTITION BY ID
                        ORDER BY
                            CASE
                                WHEN NETAMT = 0 THEN 2
                                ELSE 1
                            END
                    ) AS RN
                FROM
                    TABELA.LORIK
            )
        WHERE
            RN > 1
    );

干杯!

答案 1 :(得分:0)

您可以先按值对rowid进行排序,然后按rowid进行排序。以下内容仅保留一行,并优先显示最近的非零金额:

delete from tabela.lorik
where ROWID <> (select max(rowid) keep (dense_rank first (order by (case when amount = 0 then 1 else 2 end), rowid desc)
                from tabela.lorik l2
                where l2.id1 = l.id1
               )