web-dev-qa-db-fra.com

Comment obtenir une table dans la dernière ligne d'un Oracle

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?

25
sky scraper

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.

46
Ben
SELECT * FROM (
    SELECT * FROM table_name ORDER BY sortable_column DESC
) WHERE ROWNUM = 1;
20
rtaft

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é.

3
rslemos

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;
1
lpfx