2013-10-03 68 views
4

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

如何根据行号选择记录?

+0

你是否在谷歌搜索“'row_number()'sql in function”?什么是你的SQL服务器版本? – Kaf

+0

实际上表格中的记录没有数字。直到您在查询中设置了“ORDER BY”,行编号不适用。 –

+0

如果您正在使用SQL 2012,请在列中使用序列命令。相信我,这是一种拯救生命的方式。 –

回答

11

几个其他的答案触及的问题,但是这或许可以解释。 SQL(集合论)中确实没有暗示的顺序。因此,要参照“第五行”需要你介绍这个概念

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

在子查询中,通过定义你所期望的秩序“创造”一个行号。现在,外部查询能够将第五个条目从该有序集合中抽出。

1

您正在寻找的是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 
4

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

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

+1

您可能指的是Oracle的'ROWID',它不是一行“数字”,而是该行的物理地址。 –

+0

@a_horse_with_no_name对,就是这样。 – RBarryYoung

1

如果使用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 
+0

或者你可以使用序列命令并创建一列唯一的数字。 –

2

有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; 
    
相关问题