Je souhaite obtenir la dernière ligne que j'ai insérée dans une table d'une base de données Oracle 11g Express. Comment puis-je faire ceci?
La "dernière" ligne d'une table n'existe pas, car une table Oracle n'a pas de concept d'ordre.
Cependant, en supposant que vous souhaitiez trouver la dernière clé primaire insérée et , cette clé primaire étant un nombre incrémentant, vous pouvez procéder de la manière suivante:
select *
from ( select a.*, max(pk) over () as max_pk
from my_table a
)
where pk = max_pk
Si vous avez la date à laquelle chaque ligne a été créée, cela deviendra, si la colonne est nommée created
:
select *
from ( select a.*, max(created) over () as max_created
from my_table a
)
where created = max_created
Vous pouvez également utiliser une requête agrégée, par exemple:
select *
from my_table
where pk = ( select max(pk) from my_table )
Voici un peu SQL Fiddle pour démontrer.
SELECT * FROM (
SELECT * FROM table_name ORDER BY sortable_column DESC
) WHERE ROWNUM = 1;
La dernière ligne selon un ordre total strict sur la clé composite K (k1, ..., kn):
SELECT *
FROM TableX AS o
WHERE NOT EXISTS (
SELECT *
FROM TableX AS i
WHERE i.k1 > o.k1
OR (i.k1 = o.k1 AND i.k2 > o.k2)
...
OR (i.k1 = o.k1 AND i.k2 = o.k2 AND i.k3 = o.k3 AND ... AND i.kn > o.kn)
)
;
Étant donné le cas particulier où K est simple (c’est-à-dire non composite), ce qui précède est abrégé en:
SELECT *
FROM TableX AS o
WHERE NOT EXISTS (
SELECT *
FROM TableX AS i
WHERE i.k1 > o.k1
)
;
Notez que pour que cette requête ne renvoie qu'une seule ligne, la clé doit être commandée sans liens. Si les liens sont autorisés, cette requête renverra toutes les lignes liées avec la plus grande clé.
Vous pouvez le faire comme ça:
SELECT * FROM (SELECT your_table.your_field, versions_starttime
FROM your_table
VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE)
WHERE ROWNUM = 1;
Ou:
SELECT your_field,ora_rowscn,scn_to_timestamp(ora_rowscn) from your_table WHERE ROWNUM = 1;