Sql server SQL Server 2008 R2:不使用WHERE显示特定行

Sql server SQL Server 2008 R2:不使用WHERE显示特定行,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我的下表有三列,如下所示: 表: create table empo ( employeeID int, employeeName varchar(10), employeeSalary int ); 插入: insert into empo values(1, 'A', 1000); insert into empo values(2, 'B', 16000); insert into empo values(4, 'C', 51000); insert into e

我的下表有三列,如下所示:

表:

create table empo
(
    employeeID int,
    employeeName varchar(10),
    employeeSalary int
);
插入:

insert into empo values(1, 'A', 1000);
insert into empo values(2, 'B', 16000);
insert into empo values(4, 'C', 51000);
insert into empo values(3, 'D', 31000);
insert into empo values(5, 'E', 4000);
注意:现在我只想显示第三条记录,即
4,'C',51000
,而不在条件中使用该记录的任何值

我的尝试:

select * 
from 
    (select 
         *,
         ROW_NUMBER() OVER(ORDER BY employeeID ASC) rn
     from empo) result
where 
   result.rn = 3;
但我得到了一个错误的结果:

employeeID  employeeName    employeeSalary
-------------------------------------------
    3           D               31000

您必须
按员工姓名下单

select * from 
(
    select *,
           ROW_NUMBER() OVER(ORDER BY employeeName ASC) rn
    from empo
) result
where result.rn = 3;
根据示例数据,订单似乎由
employeeName
字段指定


请注意,在SQL表中,没有固有的行顺序。如果要指定行顺序,则必须始终在
ORDER BY
子句中指定至少一个表字段。

必须改为
ORDER BY employeeName

select * from 
(
    select *,
           ROW_NUMBER() OVER(ORDER BY employeeName ASC) rn
    from empo
) result
where result.rn = 3;
根据示例数据,订单似乎由
employeeName
字段指定


请注意,在SQL表中,没有固有的行顺序。如果要指定行顺序,始终必须在
ORDER BY
子句中至少指定一个表字段。

排序函数需要一个顺序,不允许使用常量,但可以使用每次返回相同值的函数进行欺骗

select * from 
(
    select *, ROW_NUMBER() OVER(ORDER BY LEFT(employeeName,0)) rn
    from empo
) result
where result.rn = 3
这仍然是一种黑客行为,在重建集群索引后,或者在删除和插入新行后(可以转到包含以前删除的记录的页面),顺序可能会改变


因此,强烈建议添加一个标识列并将其用于排序。

排序函数需要一个顺序,不允许使用常量,但每次返回相同值的函数可能会欺骗它

select * from 
(
    select *, ROW_NUMBER() OVER(ORDER BY LEFT(employeeName,0)) rn
    from empo
) result
where result.rn = 3
这仍然是一种黑客行为,在重建集群索引后,或者在删除和插入新行后(可以转到包含以前删除的记录的页面),顺序可能会改变


因此,强烈建议添加标识列并将其用于排序。

如果没有指定插入顺序的列,则无法获得结果。表没有固有的顺序。没有指定一个或多个列来定义顺序,就没有“第三行”。是否允许向表中添加字段以强制排序?@PanagiotisKanavos-否,聚集索引仍然不能保证行顺序。例如,SQL Server可以对另一个查询使用正在进行的表扫描,从中返回结果,然后启动另一个表扫描以完成收集results@MAK你想解决什么真正的问题?按插入顺序排序是一个非常随意的决定。您这样做是为了解决其他问题吗?如果没有指定插入顺序的列,则无法获得结果。表没有固有的顺序。没有指定一个或多个列来定义顺序,就没有“第三行”。是否允许向表中添加字段以强制排序?@PanagiotisKanavos-否,聚集索引仍然不能保证行顺序。例如,SQL Server可以对另一个查询使用正在进行的表扫描,从中返回结果,然后启动另一个表扫描以完成收集results@MAK你想解决什么真正的问题?按插入顺序排序是一个非常随意的决定。您这样做是为了解决其他问题吗?如果我将
ID=4的
employeeName
更新为
Z
,那么?和+1表示注释。结果将与“第三行”的定义一样任意。第三排根据什么标准?这个问题是有缺陷的,基于一个错误的假设,即插入顺序在某种程度上很重要(其实并不重要)@Giorgosbetos,嘿,谢谢你的回答。不管怎样,我已经解决了。如果我将
ID=4的
employeeName
更新为
Z
,那么?和+1表示注释。结果将与“第三行”的定义一样任意。第三排根据什么标准?这个问题是有缺陷的,基于一个错误的假设,即插入顺序在某种程度上很重要(其实并不重要)@Giorgosbetos,嘿,谢谢你的回答。反正我已经解决了。