问题描述
||
问题如下:
我需要获取表中记录的位置。假设我在表中有五个记录:
Name: john doe,ID: 1
Name: jane doe,ID: 2
Name: Frankie Boy,ID: 4
Name: Johnny,ID: 9
现在,“ Frankie Boy”位于表中的第三位。但是如何从SQL Server获取此信息?我可以算出ID,但它们不可靠,Frankie的ID为4,但由于删除了ID为'3 \'的记录,因此处于第三位置。
有办法吗?我知道ROW_RANK,但这会很昂贵,因为在对row_rank进行排名之前,我需要首先选择整个集合。
我正在使用MS SQL Server 2008 R2。
解决方法
表格没有\'position \'。表(= set)中的行由其主键值标识。仅结果行具有\'position \',当存在
ORDER BY
子句时可以确定。假设表(=集合)有位置,只会导致问题,而且是错误的思维方式。
,您可以使用ѭ2来标记行。您必须指定一种对行进行排序的方法:
select row_number() over (order by id) as PositionInTable,*
from YourTable
如果性能存在问题,则可以将该职位存储在新列中:
update yt1
set PositionInTable = rn
from YourTable yt1
join (
select row_number() over (order by id) as rn,id
from YourTable
) yt2
on yt1.id = yt2.id
索引为PositionInTable
时,闪电般快。但是您必须在每次插入表后进行更新。
,表在概念上没有顺序。除非您在select语句中指定ORDER BY对结果集进行排序,否则结果可以按任何顺序返回。重复执行完全相同的SQL,可能会在每次执行时以不同的顺序返回结果集。
要获取特定结果集中的行号,请使用row_number()函数:
select row = row_number() over( order by id ),*
from sysobjects
这将为sysobjects中的每一行分配一个行号,就好像该表按ID排序一样。
,一个无需使用ROW_NUMBER即可执行此操作的简单方法是,简单地计算表中有多少行的索引小于或等于所选索引,这将给出行号。
SELECT COUNT(*) FROM YourTable WHERE ID <= 4 -- Frankie Boy,Result = 3
对于您的特定情况,这可能不是最有效的方法,但是这是实现它的简单方法。