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

SQL извикване Макс. номер на ред от временна таблица

В TEMP_TABLE липсва последователен първичен ключ или друг индикатор за реда на вмъкване. Така че не е възможно да получите последния ID за LOAD, като използвате колоните на самата таблица.

Има обаче една опция:ORA_ROWSCN() . Това е псевдоколона, която идентифицира номера на системната промяна за транзакцията което промени таблицата. Така че можем да реконструираме реда на вмъкване, като сортираме таблицата по ORA_ROWSCN.

Има някои предупреждения:

  1. По подразбиране SCN се прилага за ниво блок. Следователно всички редове в един блок имат еднакъв SCN. Това е достатъчно добро приближение за широки таблици, но безнадеждно за играчка с две колони като TEMP_TABLE. Можем да проследим SCN на ниво ред, но само ако таблицата е създадена с ROWDEPENDENCIES. По подразбиране е NOROWDEPENDENCIES. За съжаление не можем да използваме ALTER TABLE тук. Ще трябва да премахнете и създадете отново таблицата (*) за да разрешите ROWDEPENDENCIES.
  2. SCN се прилага за транзакцията. Това означава, че решението ще работи само ако всеки ред в TEMP_TABLE е вмъкнат в отделна транзакция.
  3. Очевидно това е възможно само ако TEMP_TABLE е действителна таблица, а не изглед или някаква друга конструкция.

Като се има предвид, че всички тези критерии са изпълнени, ето заявка, която ще ви даде желания набор от резултати:

select load, id
from ( select load
              , id
              , row_number() over (partition by load order by ora_rowscn desc) as rn
       from temp_table
)
where rn = 1

Има демо на db<>fiddle . Освен това същата демонстрация с изключение на TEMP_TABLE, дефинирана с NOROWDEPENDENCIES, което произвежда грешен резултат .

(*) Ако трябва да запазите данните в TEMP_TABLE, стъпките са:

  1. rename TEMP_TABLE to whatever;
  2. create table TEMP_TABLE as select * from whatever rowdependencies;
  3. drop table whatever;

SCN обаче ще бъде същият за съществуващите редове. Ако това има значение, ще трябва да вмъквате всеки ред един по един, в реда, който искате да запазите, и да се ангажирате след всяко вмъкване.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle Добавете 1 час в SQL

  2. Oracle Autoincrement Functionality:Тригери или Oracle JDBC CallableStatement в 11.2?

  3. Запитване за връзки с външни ключове на таблица

  4. Как да напиша параметризирана заявка за вмъкване на оракул?

  5. Пренаредете колоните на таблицата в Oracle