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