1

如果我有一个Persons包含大约 30000 行的 SQL 表,并且我想进行一个 SQL 查询来检索行号 1000 的数据......我通过以下查询以非专业方式得到它

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是最好的方法,但由于您只想要一行,请务必查看计划。识别所需的行然后连接回原始表以检索其他列可能会更好。

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 毫秒。

计划一

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 回答