1

約30000行を含むSQLテーブルがありPersons、行番号1000のデータを取得するSQLクエリを作成したい場合...次のクエリを作成することで、非専門的な方法で取得しました

Select Top 1 * from 
(
    Select top 1000 *
    From Persons
    Order By ID 
)A
Order By A.ID desc

しかし、それはそれを行うことができるより最適化されたクエリだと思います...完璧なクエリにつながるものはありますか?
注:テーブルには「ID」と呼ばれるPK列が含まれていますが、連続していません

4

3 に答える 3

3

row_numberが最良のアプローチですが、1行だけが必要なため、必ず計画を確認してください。目的の行を特定してから、元のテーブルに結合して追加の列を取得する方がよい場合があります。

WITH T1
     AS (SELECT *,
                ROW_NUMBER() OVER (ORDER BY number) AS RN
         FROM   master..spt_values)
SELECT name,
       number,
       type,
       low,
       high,
       status
FROM   T1
WHERE  RN = 1000;

与える

テーブル 'spt_values'。スキャン カウント 1、論理読み取り2005

CPU 時間 = 0 ミリ秒、経過時間 = 19 ミリ秒。

プラン1

WITH T2
     AS (SELECT number,
                type,
                name,
                ROW_NUMBER() OVER (ORDER BY number) AS RN
         FROM   master..spt_values)
SELECT TOP 1 C.name,
             C.number,
             C.type,
             C.low,
             C.high,
             C.status
FROM   T2
       CROSS APPLY (SELECT *
                    FROM   master..spt_values v
                    WHERE  v.number = T2.number
                           AND v.type = T2.type
                           AND ( v.name = T2.name
                                  OR ( v.name IS NULL
                                       AND T2.name IS NULL ) )) C
WHERE  RN = 1000;  

与える

テーブル 'spt_values'。スキャン数 1、論理読み取り7

CPU 時間 = 0 ミリ秒、経過時間 = 1 ミリ秒。

プラン2

于 2011-03-26T12:42:05.637 に答える
1

SQL Server 2005 以降では、以下を使用できます。

WITH MyCte AS 
(
    SELECT
        [CategoryId]
        ,[CategoryName]
        ,[CategoryDescription]
        ,ROW_NUMBER() OVER (ORDER BY CategoryId ASC) AS RowNum
    FROM
        [Carmack].[dbo].[job_Categories]
)
SELECT *
FROM    MyCte
WHERE   RowNum = 3
于 2011-03-26T11:04:56.393 に答える
0

あなたはこれを試すことができます

select * from Person P
where 999 = ( select count(id) from Person P1 , Person P2 
              where P1.id = P.id and P2.id < P1.id)
于 2011-03-26T11:00:17.927 に答える