我有一个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)
您没有提到您正在运行哪个 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)
要找出记录在“哪一页”,您需要将行号除以每页的记录数,然后向上舍入到最接近的整数。