Thêm cột STT tăng dần trong View SQL Server bằng hàm cửa sổ ROW_NUMBER().
Lưu ý: STT chỉ có ý nghĩa khi có thứ tự sắp xếp rõ ràng (ORDER BY).
Dùng ROW_NUMBER() OVER(ORDER BY ...) ngay trong câu lệnh tạo view.
Chọn cột sắp xếp ổn định (ví dụ: khóa chính).
Ví dụ 1:
CREATE VIEW dbo.vw_SanPham_WithSTT
AS
SELECT
ROW_NUMBER() OVER (ORDER BY sp.SanPhamID) AS STT,
sp.SanPhamID,
sp.TenSanPham,
sp.Gia
FROM dbo.SanPham AS sp;
GO
-- Khi lấy dữ liệu, nếu cần sắp xếp hiển thị theo cùng thứ tự, nhớ ORDER BY tương ứng
SELECT * FROM dbo.vw_SanPham_WithSTT ORDER BY STT;
Ví dụ 2:
Select ROW_NUMBER() OVER(ORDER BY (SELECT 1)) TT,* From TABLE_NAME
TT có thể đổi lại thành tên mong muốn trong SQL Server hiển thị ra
Ví dụ 3:
select
ROW_NUMBER() OVER (ORDER BY _SYS_KEY) AS RowNumber
,* from tbChungTU
Nếu muốn STT bắt đầu lại từ 1 cho mỗi nhóm (ví dụ: theo DanhMucID), dùng PARTITION BY.
CREATE VIEW dbo.vw_SanPham_TheoDanhMuc_WithSTT
AS
SELECT
ROW_NUMBER() OVER (PARTITION BY sp.DanhMucID ORDER BY sp.SanPhamID) AS STT,
sp.DanhMucID,
sp.SanPhamID,
sp.TenSanPham,
sp.Gia
FROM dbo.SanPham AS sp;
GO
-- Ví dụ truy vấn theo từng danh mục
SELECT * FROM dbo.vw_SanPham_TheoDanhMuc_WithSTT
ORDER BY DanhMucID, STT;
- Chọn cột ORDER BY duy nhất/ổn định (thường là Primary Key) để STT không thay đổi ngoài ý muốn.
- Trong View, mệnh đề ORDER BY không có tác dụng trừ khi kết hợp với TOP; do đó hãy đặt ORDER BY trong hàm cửa sổ và khi SELECT từ View hãy ORDER BY cùng tiêu chí để hiển thị nhất quán.
- RANK(): nhảy số khi có giá trị bằng nhau (1,1,3…).
- DENSE_RANK(): không nhảy số (1,1,2…).
Dùng khi bạn muốn STT theo hạng thay vì từng dòng duy nhất.
Tình huống | Nguyên nhân | Cách xử lý |
---|---|---|
STT thay đổi giữa các lần xem | ORDER BY không ổn định (không duy nhất) | Dùng khóa chính hoặc bộ cột đảm bảo thứ tự duy nhất trong OVER(ORDER BY …) |
Không dùng được ORDER BY trong View | ORDER BY trong view chỉ hợp lệ khi kết hợp TOP | Đưa ORDER BY vào hàm cửa sổ; khi SELECT từ view, ORDER BY lại để hiển thị |
Muốn STT theo nhóm | Chưa dùng PARTITION BY | Dùng ROW_NUMBER() OVER(PARTITION BY Nhom ORDER BY …) |
- ROW_NUMBER() tạo STT theo thứ tự logic bạn định nghĩa, không phải cột vật lý như IDENTITY (IDENTITY không thể thêm trực tiếp trong View).
Tìm kiếm:
Thêm cột STT tăng dần trong view SQL Server