web-dev-qa-db-ja.com

Oracleテーブルの最後の行を取得する方法

Oracle 11g Expressデータベースのテーブルに挿入した最後の行を取得したい。これどうやってするの?

25
sky scraper

Oracleテーブルには順序の概念がないため、テーブルの「最後の」行のようなものはありません。

ただし、最後に挿入された主キーを見つけたいと仮定すると、この主キーは増加する番号であるため、次のようなことができます。

select *
  from ( select a.*, max(pk) over () as max_pk
           from my_table a
                )
 where pk = max_pk

各行が作成された日付がある場合、列の名前がcreatedの場合、これになります。

select *
  from ( select a.*, max(created) over () as max_created
           from my_table a
                )
 where created = max_created

または、次のような集計クエリを使用できます。

select *
  from my_table
 where pk = ( select max(pk) from my_table )

少し SQL Fiddle を示します。

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

複合キー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)
        )
;

Kが単純な(つまり、複合ではない)特別な場合を考えると、上記は次のように短縮されます:

SELECT  *
FROM    TableX AS o
WHERE   NOT EXISTS (
            SELECT  *
            FROM    TableX AS i
            WHERE   i.k1 > o.k1
        )
;

このクエリが1行だけを返すためには、キーが同順位なしで順序付けられている必要があることに注意してください。同順位が許可されている場合、このクエリは最大のキーに関連付けられたすべての行を返します。

3
rslemos

次のようにできます:

SELECT * FROM (SELECT your_table.your_field, versions_starttime
               FROM your_table
               VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE)
WHERE ROWNUM = 1;

または:

SELECT your_field,ora_rowscn,scn_to_timestamp(ora_rowscn) from your_table WHERE ROWNUM = 1;
1
lpfx