我有一张员工的桌子。它有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名员工的记录,使用的是顶部(20)。然后,我试着按降序排序20名员工的数据,然后得到最高(10)名员工。它应该从11-20回我的雇员(在任何顺序下降或减少)。但是,它从50-41返回雇员。为什么?
发布于 2016-09-03 13:29:48
不带TOP的ORDER BY返回不确定的行。您需要子查询中的ORDER BY以及外部查询:
select top(10) e.*
from (Select Top(20) e.*
from Employee e
order by t.id asc
) e
order by e.id desc;您的问题包含以下内容:“所有记录都按顺序排列”。这在关系数据库中没有任何意义。SQL表表示无序集。只有在使用ORDER BY时才会排序结果集。
注意:聚集索引的使用确实对表中记录的物理存储施加了排序。在单处理器机器(或使用单个执行线程的查询)上,根据群集键的顺序返回实际结果。但是,您仍然不应该依赖于这种行为,当您关心排序时,应该使用显式ORDER BY。
发布于 2016-09-03 13:36:31
如果您使用的是Server 2012,为什么不直接使用这样的方法:
SELECT *
FROM Employee e
ORDER BY e.id
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY https://stackoverflow.com/questions/39307432
复制相似问题