如何根据行号选择行?

时间:2013-10-03 16:43:42

标签: sql sql-server sql-server-2008 tsql

我正在开发一个小项目,我需要根据记录的实际行号从临时表中选择一条记录。

如何根据行号选择记录?

6 个答案:

答案 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_idemp_namesalary。您需要薪水最高的前10名员工。

  1. 使用row_number()分析函数

    Select * from
    ( select emp_id,emp_name,row_number() over (order by salary desc) rank
    from employee)
    where rank<=10
    
  2. 使用rank()分析函数

    Select * from
    ( select emp_id,emp_name,rank() over (order by salary desc) rank
    from employee)
    where rank<=10
    
  3. 使用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