1. ホーム
  2. sql

[解決済み] OracleのORDER BYとROWNUMを正しく使うには?

2022-06-26 15:01:38

質問

SQL Server から Oracle にストアド プロシージャを変換して、当社の製品を互換性のあるものにするのに苦労しています。

私は、タイムスタンプに基づいて、いくつかのテーブルの最新のレコードを返すクエリを持っています。

SQL Serverです。

SELECT TOP 1 *
FROM RACEWAY_INPUT_LABO
ORDER BY t_stamp DESC

=> これで最新のレコードが返されます。

しかし オラクルです。

SELECT *
FROM raceway_input_labo 
WHERE  rownum <= 1
ORDER BY t_stamp DESC

=> これは、(おそらくインデックスに依存する)最も古いレコードを返します。 ORDER BY ステートメントに関係なく、最も古いレコードを返します。

私の要件に合うように、Oracleクエリをこのようにカプセル化しました。

SELECT * 
FROM 
    (SELECT *
     FROM raceway_input_labo 
     ORDER BY t_stamp DESC)
WHERE  rownum <= 1

で、動作します。しかし、特に関係するテーブルに多くのレコードがある場合、私には恐ろしいハックのように聞こえます。

これを達成するための最良の方法は何でしょうか?

どのように解決するのですか?

この where ステートメントが実行されます。 前に の前に実行されます。 order by . ということで、目的のクエリは " と言っています。 最初の行を取得し、次に t_stamp 降順 "です。 そして、それはあなたが意図しているものではありません。

サブクエリメソッドは、Oracleでこれを行うための適切な方法です。

両方のサーバーで動作するバージョンが必要な場合、使用できます。

select ril.*
from (select ril.*, row_number() over (order by t_stamp desc) as seqnum
      from raceway_input_labo ril
     ) ril
where seqnum = 1

外側の * は最後のカラムで "1"を返すでしょう。 これを避けるには、列を個別にリストアップする必要があります。