Sử dụng ROW_NUMBER()
:
SELECT
name,
ROW_NUMBER() OVER (ORDER BY name) AS id
FROM people;
CHỈNH SỬA:
Sự khác biệt giữa ORDER BY 1
so với ORDER BY column_name
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)
Trong trường hợp thứ hai, không có thao tác sắp xếp.
Bạn cũng có thể viết truy vấn thứ hai là:
SELECT
name,
ROW_NUMBER() OVER () AS id
FROM people;
Tại sao mọi người viết ORDER BY 1
trong các chức năng cửa sổ?
Bởi vì trong một số phương ngữ, nó là bắt buộc và ORDER BY 1
hoạt động như trình giữ chỗ.
Oracle:
SELECT
name,
ROW_NUMBER() OVER (ORDER BY 1) AS id
FROM people;
TSQL:
SELECT
name,
ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS id
FROM people;