SQL-запрос: Как я могу получить данные строки с номером 1000 direclty? - PullRequest
1 голос
/ 26 марта 2011

Если у меня есть таблица SQL с именем Persons, которая содержит около 30000 строк, и я хочу сделать запрос SQL, который извлекает данные строки с номером 1000 ... Я получил это непрофессиональным способом, сделав следующий запрос

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

Но я чувствую, что это более оптимизированный запрос, который может это сделать ... может ли кто-нибудь привести меня к идеальному запросу?
Примечание: таблица содержит столбец PK с именем «ID», но он не является последовательным

Ответы [ 3 ]

3 голосов
/ 26 марта 2011

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

время ЦП = 0 мс, прошедшее время = 19 мс.

plan 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

процессорное время = 0 мс, прошедшее время = 1 мс.

Plan 2

1 голос
/ 26 марта 2011

В 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
0 голосов
/ 26 марта 2011

Вы можете попробовать это

select * from Person P
where 999 = ( select count(id) from Person P1 , Person P2 
              where P1.id = P.id and P2.id < P1.id)
...