19

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

如何根据行号选择记录?

4

6 回答 6

41

其他几个答案触及了这个问题,但这可以解释。SQL(集合论)中确实没有隐含的顺序。所以提到“第五排”需要你引入概念

Select *
From 
(
    Select 
      Row_Number() Over (Order By SomeField) As RowNum
    , *
    From TheTable
) t2
Where RowNum = 5

在子查询中,通过定义您期望的顺序来“创建”行号。现在外部查询能够从该有序集中提取第五个条目。

于 2013-10-03T16:57:14.877 回答
6

从技术上讲,SQL 行的表中没有“RowNumbers”。一些实现(我认为是 Oracle)提供了它们自己的一种,但这不是标准的,SQL Server/T-SQL 也没有。您可以使用 IDENTITY 列向表中添加一个(排序)。

或者您可以使用 ROW_NUMBER() 函数在查询中添加一个(真实的),但除非您为行指定自己的唯一 ORDER,否则 ROW_NUMBERS 将被不确定地分配。

于 2013-10-03T16:49:28.977 回答
4

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
于 2013-10-03T16:48:57.703 回答
3

有 3 种方法可以做到这一点。

假设您有一个员工表,其列为emp_id, emp_name, salary。您需要薪水最高的前 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;
    
于 2017-09-22T09:19:00.440 回答
2

如果使用 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
于 2013-10-03T16:56:40.650 回答
1

这将为您提供表格的行,而不会被某些值重新排序:

SELECT ROW_NUMBER() OVER (ORDER BY (SELECT '1')) AS RowID, * FROM #table 
于 2019-10-17T15:01:40.377 回答