1

n個のレコードを持つテーブルがあります

派生テーブルを使用せずに、SQLのテーブルからn番目のレコードと(n-1)番目のレコードを取得するにはどうすればよいですか?

私はとして使用ROWIDしてみました

select * from table where rowid in (select max(rowid) from table);

n番目のレコードを与えていますが、(n-1)番目のレコードも欲しいです。そして、使用する以外の方法はありますかmax,derived table and pseudo columns

ありがとう

4

4 に答える 4

3

rowidに依存して、テーブルの最後の行に移動することはできません。適切な順序を設定するには、自動インクリメントIDまたは作成時間が必要です。

たとえば、次のように使用できます。

select *
from (select t.*, row_number() over (order by <id> desc) as seqnum
      from t
     ) t
where seqnum <= 2

構文では許可されていますが、サブクエリのorder by句は無視されます(たとえば、http://docs.oracle.com/javadb/10.8.2.2/ref/rrefsqlj13658.html)。

明確にするために、ROWIDはテーブル内の行の順序とは何の関係もありません。Oracleのドキュメントは、データの物理アクセスパスを指定していることを明確に示しています(http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i6732)。空のデータベースでは、レコードをnewtableに挿入すると、単調に増加する行IDのシーケンスが作成される可能性があります。 しかし、これに頼ることはできません。 ROWIDの唯一の保証は、それらがテーブル内で一意であり、特定の行にアクセスするための最速の方法であるということです。

最新バージョンのサブクエリで、Oracleの処理または順序の処理を行わないことに関する適切なドキュメントが見つからないことを認めなければなりません。ANSI SQLは、サブクエリでの順序付けをサポートするために準拠データベースを必要としません。Oracle構文ではそれが可能であり、少なくとも場合によっては機能するようです。私の推測では、おそらくシングルプロセッサ、Oracleのシングルスレッドインスタンス、またはデータアクセスがインデックスを介して行われる場合に機能するでしょう。並列処理が導入されると、結果はおそらく順序付けられません。Oracleを使い始めてから(1990年代半ば)、サブクエリの順序は一般的に無視されているという印象を受けました。私のアドバイスは、Oracleがサポートされていると明確に述べるまで、機能に依存しないことです。

于 2012-07-28T19:23:38.367 に答える
2
select * from (select * from my_table order by rowid) where rownum <= 2

NとMの間の行の場合:

select * from (
   select * from (
      select * from my_table order by rowid
                 ) where rownum <= M
              ) where rownum >= N
于 2012-07-28T19:10:13.450 に答える
1

これを試して

select top 2 * from table order by rowid desc
于 2012-07-28T19:08:09.823 に答える
0

rowidテーブルの列として想定:

SELECT * FROM table ORDER BY rowid DESC LIMIT 2
于 2012-07-28T19:20:03.667 に答える