sunil kumar meena Ответов: 2

В SQL server TOP возвращает неожиданные строки.


Привет, у меня есть стол сотрудников. Он имеет EmployeeName (varchar (100)) и поле зарплаты (deciaml). Все записи находятся в отсортированном порядке,и я пытался получить записи от 11-го сотрудника до 20-го. Я знаю, что есть несколько простых способов получить эти данные, и я также сделал это 3-4 различными способами. Но один из способов, который я пробовал, не работает, и он повторяет неожиданные данные. Ниже приведены сценарии, которые я использую:

Сценарий данных:
declare @counter int = 1
while(@counter <= 50)
begin
	insert into Employee (name,salary) 	select CONCAT('name - ',@counter),100*@counter;
	set @counter += 1;
end

Select * from Employee


Запрос для извлечения записей:
select top(10) * from (
Select Top(20)* from Employee
) as t order by t.id desc


Пояснение: во-первых, я получаю записи о первых 20 сотрудниках, используя TOP(20). Затем я пытаюсь упорядочить данные 20 сотрудников в порядке убывания, а затем получить лучших (10) сотрудников. Он предполагал вернуть мне сотрудника с 11-20 (в любом порядке спуска или подъема). Но он возвращает сотрудников от 50 до 41. Почему?

Что я уже пробовал:

Я пробовал в google, все говорят о Views и TOP, но в моем случае нет никакого View.

2 Ответов

Рейтинг:
17

OriginalGriff

Вероятно, потому, что вы не указываете условие ORDER BY в наборе idder: таким образом, SQL может возвращать строки в любом порядке, который он сочтет подходящим. Затем вы берете 20 лучших из них, упорядочиваете их по идентификатору и выбираете 10 лучших из этого результата.
Если вы хотите извлечь определенные строки с помощью TOP, вам всегда нужно указать порядок, иначе у вас нет реального контроля над тем, какие строки возвращаются.


Рейтинг:
10

sunil kumar meena

select top(10) e.*
from (Select Top(20) e.*
      from Employee e
      order by e.id 
     ) e
order by e.id desc;


Это последний запрос, который возвращает ожидаемый результат. Спасибо @OriginalGriff за то, что указал на проблему в запросе.