我可以在SQL结果表中获取记录的位置吗?

时间:2009-05-25 17:12:25

标签: sql sql-order-by

如果我做的话

SELECT * FROM mytable ORDER BY mycolumn ASC;

我按特定顺序获得结果表。

在SQL中有没有办法有效地找出,给定PK,结果表中的哪个位置会包含我的PK记录?

6 个答案:

答案 0 :(得分:20)

您可以计算您正在排序的值的值低于您知道键值的记录的值:

select count(*)
from mytable
where mycolumn < (select mycolumn from mytable where key = 42)

答案 1 :(得分:18)

在支持它的数据库上,您可以使用ROW_NUMBER()来实现此目的:

SELECT RowNr
FROM (
    SELECT 
         ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr,
         mycolumn
    FROM mytable
) sub
WHERE sub.mycolumn = 42

该示例假设您正在寻找主键42:)

子查询是必要的,因为类似于:

SELECT 
     ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr
FROM mytable
WHERE sub.mycolumn = 42

将永远返回1;可以这么说,ROW_NUMBER()在WHERE之后工作。

答案 2 :(得分:2)

SQL无法正常工作。它是基于集合的,这意味着“结果表中的位置”对数据库毫无意义。

将ResultSet映射到对象集合或迭代它时,可以跟踪位置。

答案 3 :(得分:0)

不幸的是,你无法获得“表中行的位置”。

使用ORDER BY和ROW_NUMBER构造的变体(取决于正在使用的数据库引擎),您可以获得的最佳结果是在执行的查询的结果集中行的位置。

此位置不会映射回表中的任何位置,除非ORDER BY位于一组聚簇索引列上,但即使这样,该位置也可能在下一秒失效。

我想知道的是你打算使用这个“职位”。

答案 4 :(得分:0)

此答案适用于MySQL

==>低于8.0

SET @row_number = 0; 
SELECT 
    (@row_number:=@row_number + 1) AS num, 
    myColumn.first, 
    myColumn.second
FROM
    myTable
ORDER BY myColumn.first, myColumn.second   

来源:http://www.mysqltutorial.org/mysql-row_number/


==>大于8.0

请参阅MySQL ROW_NUMBER() function manual,因为我没有测试。但似乎首选此功能。

答案 5 :(得分:-1)

如果不选择整个记录子集,就无法确定。如果你的PK是整数类型,你可以

select count(*) from mytable 
    where id <= 10 -- Record with ID 10
    order by mycolumn asc