Oracle
 sql >> база данни >  >> RDS >> Oracle

Изтрийте дублиращи се записи с помощта на rownum в sql

Използвайте rowid

DELETE FROM table_name a
 WHERE EXISTS( SELECT 1
                 FROM table_name b
                WHERE a.id = b.id
                  AND a.name = b.name
                  AND a.rowid > b.rowid )

Разбира се, можете да направите a.rowid < b.rowid както добре. rowid е само физическият адрес на реда, така че няма значение дали ще изтриете реда, който има по-големия или по-малкия адрес.

Очакваните от вас резултати обаче нямат смисъл.

Expected Result :

        ROWNUM         ID NAME
    ---------- ---------- ----------
             4          1 leo_1
             5          2 leo_2
             6          3 leo_3

rownum на набор от резултати винаги се присвоява по време на заявка. Това означава, че определен ред може да се появи с различен rownum стойности в различни заявки (или когато една и съща заявка се изпълнява няколко пъти). rownum винаги е последователен, така че никога не можете да имате rownum от 4 в набор от резултати, без също да има rownum стойности от 1, 2 и 3 в един и същ набор от резултати. Който и дублиран ред да изтриете, резултатът ще бъде

Очакван резултат:

    ROWNUM         ID NAME
---------- ---------- ----------
         1          1 leo_1
         2          2 leo_2
         3          3 leo_3

Но rownum стойностите са произволни. Би било също толкова валидно Oracle да се върне

Очакван резултат:

    ROWNUM         ID NAME
---------- ---------- ----------
         1          2 leo_2
         2          3 leo_3
         3          1 leo_1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. грешка 3706 доставчикът не може да бъде намерен. може да не е инсталиран правилно

  2. Как да разберете какво е добър индекс?

  3. Големи проблеми с производителността с Oracle DataReader в .Net

  4. Грешка на Oracle несъвместими типове данни:очакваният CHAR получи LONG

  5. Oracle SQL GROUP BY не е помощен израз за GROUP BY