1

テーブル (Article) があり、10 個のレコードがあり、最後の 4 つのレコード (6、7、8、9) を 10 番目なしで取得したいと考えています。クエリは、10 を超えるレコードに対しても機能し、最後の 4 行を絶対的な最後の行なしで取得することもできます。前もって感謝します!

4

1 に答える 1

6

SQL では、テーブルは本質的に順不同です。では、順序を指定する列 (id 列、日時など) があると仮定します。

以下はあなたが望むことをします:

select top 4 *
from (select top 5 *
      from Article a
      order by id desc
     ) a
order by id asc

何らかの理由で ID を持っていない場合は、次のクエリを使用してチャンスをつかむことができます。

select a.*
from (select a.*, row_number() over (order by (select NULL)) as seqnum,
             count(*) over () as totcnt
      from Article a
     ) a
where seqnum between totcnt - 5 and totcnt - 1

これが機能することを保証するものではないことを強調したいと思います。私の経験では、seqnum の定義が行に連続番号を順番に割り当てることを見てきました。しかし、これは動作することが保証されておらず、おそらくマルチスレッド環境では動作しません。ただし、運がよい場合もあります (特に、行が 1 つのデータ ページに収まる場合)。

ちなみに、実際の列でも同じ考え方を使用できます。

select a.*
from (select a.*, row_number() over (order by id) as seqnum,
             count(*) over () as totcnt
      from Article a
     ) a
where seqnum between totcnt - 5 and totcnt - 1
于 2013-02-03T17:49:44.253 に答える