5

TOP が有効になったかどうかを示すキーワードまたはメタ情報が SQL Server にありますか?

EX:
Select TOP 5 * From Stuff

RESULT: 5 rows

6 つ以上あったかどうかを判断する最善の方法は何ですか?

I could do:
SELECT TOP 6 count(*) FROM Stuff

しかし、実際のクエリはこれよりもはるかに複雑で、大きなテーブル上にあるため、カウントを取得するための別の呼び出しが心配です。

ありがとう!

4

6 に答える 6

12

あなたが使用できる自動のものは何もありません。これらの線に沿って何かを使用できます

DECLARE @N INT = 5;

WITH T
     AS (SELECT TOP (@N + 1) *
         FROM   master..spt_values
         ORDER  BY number)
SELECT TOP (@N) *,
             CASE
               WHEN Count(*) OVER () = (@N + 1) THEN 1
               ELSE 0
             END AS MoreRecords
FROM   T
ORDER  BY number 
于 2012-06-13T18:38:43.357 に答える
7

上位の N+1 (この例では N は 5 であるため、この例では上位 6 を選択) を選択し、クライアント コードの最後の要素を破棄し、6 番目の要素の存在を使用して TOP かどうかを判断できます。そもそも N を使用していれば効果があったでしょう。ただし、これを行う価値があるかどうかはわかりません。

于 2012-06-13T18:43:24.210 に答える
0

同じロジックを持つサブクエリの COUNT(*) が 5 より大きい値を返す場合は true を返し、5 以下の値を返す場合は false を返すブール値をクエリに追加できます。

これにより、返されるデータに必要な情報が追加されます。パフォーマンスが心配で、クエリが非常に複雑な場合は、個別のクエリに比べて大幅な改善は得られないかもしれませんが、せいぜいわずかな改善しか得られないはずです。

于 2012-06-13T18:36:26.337 に答える
0

2 つのクエリを実行するか、パフォーマンスを低下させる再評価を行わずにそれを行う方法はありません...

Select TOP 5 * From Stuff

Select Count(*) From Stuff
于 2012-06-13T18:37:05.947 に答える
0
SELECT TOP 5 Field1, field2, recordcount 
FROM Stuff
CROSS JOIN  (SELECT  COUNT(*) as recordcount FROM Stuff) a
ORDER BY Field1
于 2012-06-13T18:42:24.790 に答える
0
select top 5 *,
    case when count(*) OVER() <= 5 then 'yes' else 'no' end as AllRecordsReturned
from supportContacts
于 2012-06-13T18:42:53.213 に答える