我正在做一个小项目,我需要根据记录的实际行号从临时表中选择一条记录。
如何根据行号选择记录?
其他几个答案触及了这个问题,但这可以解释。SQL(集合论)中确实没有隐含的顺序。所以提到“第五排”需要你引入概念
Select *
From
(
Select
Row_Number() Over (Order By SomeField) As RowNum
, *
From TheTable
) t2
Where RowNum = 5
在子查询中,通过定义您期望的顺序来“创建”行号。现在外部查询能够从该有序集中提取第五个条目。
从技术上讲,SQL 行的表中没有“RowNumbers”。一些实现(我认为是 Oracle)提供了它们自己的一种,但这不是标准的,SQL Server/T-SQL 也没有。您可以使用 IDENTITY 列向表中添加一个(排序)。
或者您可以使用 ROW_NUMBER() 函数在查询中添加一个(真实的),但除非您为行指定自己的唯一 ORDER,否则 ROW_NUMBERS 将被不确定地分配。
row_number()
正如 Kaf 在评论中提到的,您正在寻找的是功能。
这是一个例子:
WITH MyCte AS
(
SELECT employee_id,
RowNum = row_number() OVER ( order by employee_id )
FROM V_EMPLOYEE
ORDER BY Employee_ID
)
SELECT employee_id
FROM MyCte
WHERE RowNum > 0
有 3 种方法可以做到这一点。
假设您有一个员工表,其列为emp_id
, emp_name
, salary
。您需要薪水最高的前 10 名员工。
使用row_number()
解析函数
Select * from
( select emp_id,emp_name,row_number() over (order by salary desc) rank
from employee)
where rank<=10
使用rank()
解析函数
Select * from
( select emp_id,emp_name,rank() over (order by salary desc) rank
from employee)
where rank<=10
使用rownum
select * from
(select * from employee order by salary desc)
where rownum<=10;
如果使用 SQL Server 2012,您现在可以使用偏移/获取:
declare @rowIndexToFetch int
set @rowIndexToFetch = 0
select
*
from
dbo.EntityA ea
order by
ea.Id
offset @rowIndexToFetch rows
fetch next 1 rows only
这将为您提供表格的行,而不会被某些值重新排序:
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT '1')) AS RowID, * FROM #table