Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wywołanie SQL Maksymalna liczba wierszy z tabeli tymczasowej

TEMP_TABLE nie ma sekwencyjnego klucza głównego ani żadnego innego wskaźnika kolejności wstawiania. Dlatego nie jest możliwe uzyskanie najnowszego identyfikatora LOAD przy użyciu kolumn samej tabeli.

Jest jednak jedna opcja:ORA_ROWSCN() . To jest pseudokolumna, która identyfikuje numer zmiany systemu dla transakcji który zmienił stół. Możemy więc zrekonstruować kolejność wstawiania, sortując tabelę według ORA_ROWSCN.

Istnieją pewne zastrzeżenia:

  1. Domyślnie SCN dotyczy poziomu bloku. W konsekwencji wszystkie wiersze w bloku mają ten sam SCN. To wystarczająco dobre przybliżenie dla szerokich stołów, ale beznadziejne dla dwukolumnowej zabawki, takiej jak TEMP_TABLE. SCN możemy śledzić na poziomie wiersza, ale tylko wtedy, gdy tabela jest utworzona za pomocą ROWDEPENDENCIES. Wartość domyślna to NOROWDEPENDENCIES. Niestety nie możemy tutaj użyć ALTER TABLE. Będziesz musiał usunąć i odtworzyć tabelę (*) aby włączyć ROWDEPENDENCIES.
  2. Numer SCN dotyczy transakcji. Oznacza to, że rozwiązanie będzie działać tylko wtedy, gdy każdy wiersz w TEMP_TABLE zostanie wstawiony w osobnej transakcji.
  3. Oczywiście jest to możliwe tylko wtedy, gdy TEMP_TABLE jest rzeczywistą tabelą, a nie widokiem lub inną konstrukcją.

Biorąc pod uwagę, że wszystkie te kryteria są spełnione, oto zapytanie, które da ci żądany zestaw wyników:

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

Jest demo na db<>fiddle . Również to samo demo, z wyjątkiem TEMP_TABLE zdefiniowanego za pomocą NOROWDEPENDENCIES, który daje błędny wynik .

(*) Jeśli chcesz zachować dane w TEMP_TABLE, wykonaj następujące czynności:

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

Jednak SCN będzie taki sam dla istniejących wierszy. Jeśli to ma znaczenie, będziesz musiał wstawiać każdy wiersz pojedynczo, w kolejności, w jakiej chcesz zachować, i zatwierdzać po każdym wstawieniu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie Oracle SQL do odejmowania czasu od znacznika czasu

  2. Schemat APPLSYSPUB

  3. Jak programowo identyfikować zależności procedury składowanej?

  4. Tworzenie prostego interfejsu użytkownika umożliwiającego dostęp do bazy danych Oracle

  5. ODP.NET / EF6 - typ danych CHAR w klauzuli WHERE