2

SQLステートメントからレコードのページ付けを作成しようとしていますが、すべての次と前を取得できましたが、SQLクエリが2行ではなく1行しか返さないため、最後のレコードは前のレコードを次として表示します。次を設定しています最初の結果と2番目の結果としての前の結果に基づきます。

データ:

  • アップル
  • バナナ
  • 葡萄
  • オレンジ

SQL:

select * 
from (select top 1 fruit 
      FROM table 
      where fruit > 'Banana' 
      order by fruit asc) as x 

UNION ALL 

select * 
from (select top 1 fruit 
      FROM table 
      where fruit < 'Banana' order by fruit desc) as y

結果:

fruit
--------
Grape
Apple

これはうまくいきます!

最初のレコードの場合-最初のレコードが真の次のレコードである場合に正しい結果が得られます。最後のレコードの場合-前のレコードを取得する2番目のクエリである1つの結果が得られます。ただし、最後のレコードを知る方法がないため、PreviousではなくNextとして出力されます。

それが最後のレコードであり、返される単一の行が実際には前のレコードであるとどのように判断しますか?

また

次のクエリに対してクエリがNULL行を返すようにするにはどうすればよいですか?だから私はNULLの結果に対してテストすることができますか?

ボーナスポイント!

循環ページネーションを有効にできるように、最初のレコード、最後のレコード、次と前のレコードを取得する1つのクエリを作成するにはどうすればよいですか?最初のレコードにある場合は、最後のレコードを前と同じように表示します。最後のレコードで次のレコードを最初のレコードとして表示する場合はどうなりますか?

4

1 に答える 1

3
SELECT
  *
FROM
(
  SELECT
    MIN(fruit)   as first,
    MAX(fruit)   as previous
  FROM
    yourTable
  WHERE
    fruit < 'banana'
)
CROSS JOIN
(
  SELECT
    MIN(fruit)   as next,
    MAX(fruit)   as last
  FROM
    yourTable
  WHERE
    fruit > 'banana'
)

または、短いですが、パフォーマンスが向上するかどうかはわかりません...

SELECT
  MIN(CASE WHEN fruit < 'banana' THEN fruit END)   as first,
  MAX(CASE WHEN fruit < 'banana' THEN fruit END)   as previous,
  MIN(CASE WHEN fruit > 'banana' THEN fruit END)   as next,
  MAX(CASE WHEN fruit > 'banana' THEN fruit END)   as last
FROM
  yourTable

または、最後の奇妙なオプションとして...

SELECT
  (SELECT TOP 1 fruit FROM yourTable WHERE fruit < 'banana' ORDER by fruit ASC)  AS first,
  (SELECT TOP 1 fruit FROM yourTable WHERE fruit < 'banana' ORDER by fruit DESC) AS previous,
  (SELECT TOP 1 fruit FROM yourTable WHERE fruit > 'banana' ORDER by fruit ASC)  AS next,
  (SELECT TOP 1 fruit FROM yourTable WHERE fruit > 'banana' ORDER by fruit DESC) AS last

(これは、それぞれが迅速かつ個別に検索されるため、数千以上のレコードがある場合に役立つことがあります。)

于 2012-11-29T12:09:14.707 に答える