我有一个SQL查询:
select id, name from table order by name
结果如下:
52 arnold
33 berta
34 chris
47 doris
52 emil
对于给定的id = 47,我如何确定结果集中的位置? 结果应该是4因为:
52 arnold
33 berta
34 chris
在before(47,doris)之前,id = 41在结果集的第4个位置。
如何在SQL中执行此操作? 怎么用HQL? 在一个分页示例中,我是否必须执行2个语句,或者是否有一个解决方案,我可以准确检索包含id = 47的行的窗口?
postgreSQL和java
答案 0 :(得分:11)
之前的帖子是正确的。如果使用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]
答案 1 :(得分:3)
您没有提到您正在运行的RDBMS,但如果您使用的是SQL Server 2005或更高版本,则可以使用ROW_NUMBER()函数 - 如下所示:
SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) AS RowNumber
FROM MyTable
然后,要获取给定的行,您可以使用派生表或公用表表达式 - 如下所示:
;WITH NumberedRows
AS
(SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) AS RowNumber
FROM MyTable)
SELECT RowNumber FROM NumberedRows WHERE id = 47
要整理记录所在的“哪个页面”,您需要将行号除以每页的记录数,然后向上舍入到最接近的整数。
答案 2 :(得分:2)
假设SQL 2005,您可以使用Row_Number
答案 3 :(得分:1)
答案取决于您使用的SQL版本。
如果您使用的是MSSQL 2005,则可以使用新的分析函数ROW_NUMBER(),它按照order by子句的顺序生成序列号。 ROW_NUMBER()函数的语法是:
ROW_NUMBER()OVER(ORDER BY)
或
ROW_NUMBER()OVER(PARTITION BY)
如果您使用的是旧版本的SQL Server,则可以使用标识列创建临时表,并从中选择结果。
答案 4 :(得分:1)
使用Row_Number