如何确定sql结果集中行的位置?

Chr*_*ris 10 sql count

我有一个SQL查询:

select id, name from table order by name
Run Code Online (Sandbox Code Playgroud)

结果如下:

52 arnold 
33 berta 
34 chris 
47 doris
52 emil
Run Code Online (Sandbox Code Playgroud)

对于给定的id = 47,我如何确定结果集中的位置?结果应该是4因为:

52 arnold
33 berta
34 chris
Run Code Online (Sandbox Code Playgroud)

在(47,doris)之前,id = 41在结果集中的第4个位置.

如何在SQL中执行此操作?怎么用HQL?在一个分页示例中,我是否必须执行2个语句,或者是否有一个解决方案,我可以准确检索包含id = 47的行的窗口?

postgreSQL和java

Bob*_* Mc 12

以前的帖子是正确的.如果使用Microsoft SQL Server 2005或更高版本,请使用ROW_NUMBER.

但是,您的标记没有指定您正在使用MSSQL,因此这里的解决方案应该适用于大多数RDBMS实现.实质上,根据外部查询的ORDER子句的值,使用相关子查询来确定同一集合中小于当前行的行数.像这样的东西:

SELECT      T1.id,
            T1.[name],
            (SELECT COUNT(*) 
             FROM table T2 
             WHERE T2.[name] < T1.[name]) + 1 AS rowpos
FROM        table T1
ORDER BY    T1.[name]
Run Code Online (Sandbox Code Playgroud)


Aar*_*ton 6

您没有提到您正在运行哪个 RDBMS,但如果您使用的是 SQL Server 2005 或更高版本,则可以使用 ROW_NUMBER() 函数 - 如下所示:

SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) AS RowNumber
FROM   MyTable
Run Code Online (Sandbox Code Playgroud)

然后,要获取给定的行,您可以使用派生表或公用表表达式 - 如下所示:

;WITH NumberedRows
AS
(SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) AS RowNumber
FROM    MyTable)
SELECT RowNumber FROM NumberedRows WHERE id = 47
Run Code Online (Sandbox Code Playgroud)

要找出记录在“哪一页”,您需要将行号除以每页的记录数,然后向上舍入到最接近的整数。