Oracle удаляет дубликаты на основе условия - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь удалить некоторые дубликаты из таблицы и пытаюсь сохранить один из дубликатов для столбца ID1.

С помощью этого запроса мне удалось удалить на основе ROWID.

delete from    tabela.lorik
where ROWID not in (
select MAX(ROWID) 
from     tabela.lorik
GROUP BY ID1) 

Теперь я хочу удалить все найденные дубликаты записей, где NETAMT = 0

enter image description here

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Вы можете заказать rowid s сначала по значению, а затем 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
               )
0 голосов
/ 21 октября 2019

Вы можете добиться этого, используя следующий запрос:

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
    );

Ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...