139

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

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

SQLサーバー:

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

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

これを達成する最良の方法は何ですか?

4

5 に答える 5

134

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」を返します。これを回避するには、列を個別にリストする必要があります。

于 2013-02-26T14:41:59.780 に答える
47

ROW_NUMBER()代わりに使用してください。ROWNUMは疑似列でROW_NUMBER()あり、関数です。それらの違いについて読んで、以下のクエリの出力の違いを確認できます。

SELECT * FROM (SELECT rownum, deptno, ename
           FROM scott.emp
        ORDER BY deptno
       )
 WHERE rownum <= 3
 /

ROWNUM    DEPTNO    ENAME
---------------------------
 7        10    CLARK
 14       10    MILLER
 9        10    KING


 SELECT * FROM 
 (
  SELECT deptno, ename
       , ROW_NUMBER() OVER (ORDER BY deptno) rno
  FROM scott.emp
 ORDER BY deptno
 )
WHERE rno <= 3
/

DEPTNO    ENAME    RNO
-------------------------
10    CLARK        1
10    MILLER       2
10    KING         3
于 2013-02-26T14:47:43.657 に答える
5

Oracle 12c 以降、まさにこれを行う行制限句ができました。

SELECT *
FROM raceway_input_labo 
ORDER BY t_stamp DESC
FETCH FIRST ROW ONLY

または、さまざまなシナリオ (最初の n 行、引き分けの処理など) に対する多くの代替手段。

于 2021-05-12T15:03:10.643 に答える
-1

このユースケースで提案する代替手段は、MAX(t_stamp) を使用して最新の行を取得することです...

select t.* from raceway_input_labo t
where t.t_stamp = (select max(t_stamp) from raceway_input_labo) 
limit 1

私のコーディングパターンの好み(おそらく)-信頼性が高く、一般的に、ソートされたリストから最初の行を選択しようとするよりも優れたパフォーマンスを発揮します-また、意図はより明示的に読みやすいです。
お役に立てれば ...

SQLer

于 2016-10-20T12:51:18.537 に答える