Use ROW_NUMBER()
:
SQLFiddle http://sqlfiddle.com/#!15/b5bb81/2/0
SELECT
name,
ROW_NUMBER() OVER (ORDER BY name) AS id
FROM people;
EDIT:
之间的区别ORDER BY 1
vs ORDER BY column_name
SQLFiddle演示 http://sqlfiddle.com/#!15/a227e/4/1
SELECT
name,
ROW_NUMBER() OVER (ORDER BY name) AS id
FROM people;
/* Execution Plan */
QUERY PLAN WindowAgg (cost=83.37..104.37 rows=1200 width=38)
-> Sort (cost=83.37..86.37 rows=1200 width=38)
**Sort Key: name**
-> Seq Scan on people (cost=0.00..22.00 rows=1200 width=38)
SELECT
name,
ROW_NUMBER() OVER (ORDER BY 1) AS id
FROM people;
/* Execution Plan */
QUERY PLAN WindowAgg (cost=0.00..37.00 rows=1200 width=38)
-> Seq Scan on people (cost=0.00..22.00 rows=1200 width=38)
在第二种情况下,没有排序操作。
您还可以将第二个查询编写为:
SELECT
name,
ROW_NUMBER() OVER () AS id
FROM people;
人们为什么写作ORDER BY 1
在窗口函数中?
因为在某些方言中这是必需的并且ORDER BY 1
其作用类似于占位符。
Oracle:
ORA-30485: 窗口规范中缺少 ORDER BY 表达式
SELECT
name,
ROW_NUMBER() OVER (ORDER BY 1) AS id
FROM people;
TSQL:
函数“ROW_NUMBER”必须具有带有 ORDER BY 的 OVER 子句。
SELECT
name,
ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS id
FROM people;