Vấn đề:
Bạn muốn cung cấp cho mỗi hàng trong bảng kết quả một số riêng biệt.
Ví dụ:
Cơ sở dữ liệu của chúng tôi có một bảng có tên furniture
với dữ liệu trong các cột sau:code
(khóa chính) và name
.
mã | tên |
---|---|
101 | giường |
202 | ghế sofa |
333 | ghế |
123 | tủ sách |
235 | bảng |
766 | bàn |
furniture
bảng lưu trữ tên của các món đồ nội thất mà chúng tôi muốn đánh số.
Giải pháp:
SELECT ROW_NUMBER () OVER () AS num_row, code, nameFROM nội thất;
Truy vấn trả về số hàng của mỗi món đồ nội thất cùng với tên và mã của nó:
num_row | tên | mã |
---|---|---|
1 | giường | 101 |
2 | ghế sofa | 202 |
3 | ghế | 333 |
4 | tủ sách | 123 |
5 | bảng | 235 |
6 | bàn | 766 |
Lưu ý rằng tên của các món đồ nội thất không được sắp xếp.
Thảo luận:
Nếu bạn muốn đánh số từng hàng trong một tập hợp kết quả, SQL cung cấp ROW_NUMBER()
hàm số. Hàm này được sử dụng trong SELECT
mệnh đề với các cột khác. Sau ROW_NUMBER()
, chúng tôi gọi là OVER()
hàm số. Nếu bạn chuyển bất kỳ đối số nào vào OVER
, việc đánh số hàng sẽ không được sắp xếp theo bất kỳ cột nào. Do đó, thứ tự của các hàng được hiển thị sẽ không xác định; trong hầu hết các trường hợp, đó là thứ tự mà các bản ghi được chèn vào bảng. Việc đánh số các hàng bắt đầu từ 1. Trong ví dụ của chúng tôi, mỗi bản ghi có một số từ 1 đến 6.
Chúng tôi cũng có thể chỉ định số hàng bằng cách sử dụng một cột. Trong ví dụ dưới đây, chúng tôi đánh số các bản ghi được sắp xếp theo tên. Chúng tôi thực hiện việc này bằng cách chuyển đối số đó đến OVER
cùng với ORDER BY
(nó sắp xếp các bản ghi theo cột tên):
CHỌN ROW_NUMBER () HẾT (ĐẶT HÀNG THEO tên) NHƯ num_row, name, codeFROM nội thất;
Khi bạn nhìn vào tập hợp kết quả, bạn sẽ thấy các hàng được sắp xếp với số của chúng:
hàng | tên | mã |
---|---|---|
1 | giường | 101 |
2 | tủ sách | 123 |
3 | ghế | 333 |
4 | bàn | 766 |
5 | ghế sofa | 202 |
6 | bảng | 235 |
Số được cung cấp bởi ROW_NUMBER()
không phụ thuộc vào thứ tự của các hàng trong bảng kết quả. Trong ví dụ bên dưới, chúng tôi đánh số bản ghi bằng cách sử dụng tên cột đã sắp xếp (OVER(ORDER BY name)
), nhưng chúng tôi hiển thị các bản ghi trong tập hợp kết quả theo một cột khác (trong ví dụ của chúng tôi, ORDER BY code
).
SELECT ROW_NUMBER () OVER (ORDER BY name) AS num_row, name, codeFROM nội thấtORDER BY code;
Truy vấn trả về số mỗi hàng, nhưng những số này không theo thứ tự tăng dần, vì các bản ghi được sắp xếp theo mã cột:
hàng | tên | mã |
---|---|---|
1 | giường | 101 |
2 | tủ sách | 123 |
5 | ghế sofa | 202 |
6 | bảng | 235 |
3 | ghế | 333 |
4 | bàn | 766 |
Thứ tự mặc định của các hàng được sắp xếp tăng dần, nhưng bạn cũng có thể sắp xếp theo thứ tự giảm dần bằng cách sử dụng DESC
từ khóa sau tên của cột mà bạn muốn sắp xếp:
CHỌN ROW_NUMBER () HẾT (ĐẶT HÀNG THEO tên ASC) NHƯ số_mục, tên, mã_mục_lựcTruy vấn ở trên trả về tập kết quả:
hàng | tên | mã |
---|---|---|
4 | bàn | 766 |
3 | ghế | 333 |
6 | bảng | 235 |
5 | ghế sofa | 202 |
2 | tủ sách | 123 |
1 | giường | 101 |