SQL ServerからOracleにストアドプロシージャを変換して、製品との互換性を維持するのが苦労しています。Oracle ORDER BYとROWNUMを正しく使用する方法は?
私はタイムスタンプに基づいていくつかのテーブルの最新のレコードを返すクエリを、持っている:
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
、それが動作します。しかし、私は恐ろしいハックのように聞こえます。特に、関係するテーブルにたくさんのレコードがある場合は、そうです。
これを達成する最も良い方法は何ですか?
(http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197 [ROWNUMと制限結果について]。 html) –
あなたの最後のクエリで行ったことは正しいです。順序付けられたレコードのリストの1行目を選択します。単純にカプセル化を照会します。 – araknoid
これはマニュアルに明記されています。http://docs.oracle.com/cd/E11882_01/server.112/e26088/pseudocolumns009.htm#i1006297 –