我正在开发一个小项目,我需要根据记录的实际行号从临时表中选择一条记录。
如何根据行号选择记录?
答案 0 :(得分:21)
其他几个问题涉及到这个问题,但这可能会解释。 SQL(集合论)中确实没有隐含的顺序。所以要参考“第五行”要求你引入概念
Select *
From
(
Select
Row_Number() Over (Order By SomeField) As RowNum
, *
From TheTable
) t2
Where RowNum = 5
在子查询中,通过定义您期望的顺序来“创建”行号。现在外部查询能够从该有序集中拉出第五个条目。
答案 1 :(得分:4)
从技术上讲,SQL Rows的表中没有“RowNumbers”。一些实现(Oracle,我认为)提供了自己的一个,但这不是标准的,而SQL Server / T-SQL则没有。您可以使用IDENTITY列向表中添加一个(类型)。
或者您可以使用ROW_NUMBER()函数在查询中添加一个(实际),但除非您为行指定自己的唯一ORDER,否则将非确定地分配ROW_NUMBERS。
答案 2 :(得分:2)
你正在寻找的是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 :(得分:1)
如果使用SQL Server 2012,您现在可以使用offset / fetch:
declare @rowIndexToFetch int
set @rowIndexToFetch = 0
select
*
from
dbo.EntityA ea
order by
ea.Id
offset @rowIndexToFetch rows
fetch next 1 rows only
答案 4 :(得分:1)
有三种方法可以做到这一点。
假设您有一个员工表,其列为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;
答案 5 :(得分:0)
这将为您提供表的行,而无需按某些值集进行重新排序:
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT '1')) AS RowID, * FROM #table