Mysql

是否可以按照符合 SQL 標準的順序可靠地對行進行編號?

  • December 18, 2016

例如,如果我有一個單列表numbers,並且我想 1)按 asc/desc 順序對它們進行排序 2)(重新)使用該順序將它們從 1 編號到 n(所以我可以說這個數字是ith最大的/最小)。

如果數據庫沒有 row_number 函式(例如 MySQL),那該怎麼做呢?

如果我理解正確,SELECT 返回未指定行的順序可能會不一致。

像這樣的東西(在類似問題的許多答案中提出)

SET @num = 0;
SELECT number, @num := @num + 1 as num FROM ... ORDER BY number

是錯誤的,因為似乎無法保證評估 ORDER BY 的時間。即它可以先對數字進行排序,然後使用 對它們進行編號@num,或者它可以做相反的事情並在所有行都被編號後進行排序。我對麼?

並且使用內部選擇也無濟於事,因為不能保證訂單會被保留。

有一種方法可以僅使用 SQL 89 功能,但在任何實際大小的表上都會非常慢*:*

select t1.id, 
      ... other columns ...,
      (select count(*) 
       from the_table t2 
       where t2.id <= t1.id) as row_num
from the_table t1
order by t1.id;

這假定id是用於對數字進行排序的列。

MariaDB 10.2.2 有一堆視窗函式。從理論上講,它們應該“符合標準”。

一個例子:(也展示了一個序列號生成器)

SELECT ROW_NUMBER() OVER(ORDER BY seq) AS row_num,
      seq*seq
   FROM seq_10_to_20_step_2;

+---------+---------+
| row_num | seq*seq |
+---------+---------+
|       1 |     100 |
|       2 |     144 |
|       3 |     196 |
|       4 |     256 |
|       5 |     324 |
|       6 |     400 |
+---------+---------+
6 rows in set (0.00 sec)

引用自:https://dba.stackexchange.com/questions/158460