首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL server中,TOP返回意外行。

在SQL server中,TOP返回意外行。
EN

Stack Overflow用户
提问于 2016-09-03 13:27:21
回答 2查看 138关注 0票数 1

我有一张员工的桌子。它有EmployeeName (varchar(100))和工资字段(deciaml)。所有的记录都是按顺序排列的,我试着从第11名员工中提取记录到20名员工。我知道有多种简单的方法来获取这些数据,我也使用了3-4种不同的方法。但是,我尝试的方式之一是不工作,它会还原意外的数据。下面是我正在使用的脚本:

数据脚本:

代码语言:javascript
复制
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

查询以获取记录:

代码语言:javascript
复制
select top(10) * from (
Select Top(20)* from Employee
) as t order by t.id desc

说明:首先,我得到了前20名员工的记录,使用的是顶部(20)。然后,我试着按降序排序20名员工的数据,然后得到最高(10)名员工。它应该从11-20回我的雇员(在任何顺序下降或减少)。但是,它从50-41返回雇员。为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-03 13:29:48

不带TOPORDER BY返回不确定的行。您需要子查询中的ORDER BY以及外部查询:

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2016-09-03 13:36:31

如果您使用的是Server 2012,为什么不直接使用这样的方法:

代码语言:javascript
复制
SELECT *
FROM Employee e
ORDER BY e.id
OFFSET  10 ROWS 
FETCH NEXT 10 ROWS ONLY 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39307432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档