Tôi thấy một tuyên bố TSQL ngắn gọn có hiệu quả phân tách một chuỗi thành các ký tự cấu thành của nó, mỗi chuỗi trên một dòng, nhằm mục đích đánh ascii
giá giá trị trên mỗi ký tự.
Nếu tôi đang đọc truy vấn một cách chính xác, hiệu quả, 3 CTE đang được sử dụng để chuẩn bị một bảng gồm 1 cột chứa 10.000 hàng, mỗi hàng có giá trị '0'.
CTE thứ tư được định nghĩa như sau:
cteTally(n) AS(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) n
FROM E4
)
Sau đó, CTE này được nối với một bảng chứa một cột có các chuỗi quan tâm, với các mục sau select
:
SELECT n, SUBSTRING(LastName, n, 1), ASCII( SUBSTRING(LastName, n, 1))
Đó là, hàng số n, sau đó là ký tự thứ n trong LastName, sau đó là giá trị ascii của ký tự đó.
Các câu hỏi của tôi liên quan đến over
mệnh đề trong CTE ở trên.
Về cơ bản, chính xác thì nó đang làm gì?
Nếu chúng ta đang truy vấn row_number từ 10.000 hàng giống nhau, tại sao chúng ta cần một order by
mệnh đề? Tại sao mệnh đề order by
được đặt vào một over
mệnh đề chứ không phải là một order by
mệnh đề cho select
câu lệnh - đặc biệt là over
mệnh đề thậm chí không chỉ định bất kỳ phân vùng nào? (Tôi đoán điều này có nghĩa là cửa sổ trên đó row_number
hoạt động đủ 10.000 hàng?) Và ý nghĩa của việc đặt hàng là select null
gì?
over
mệnh đề nóiorder by
là tùy chọn - nhưng tôi đoán điều này có nghĩa là các phân vùng có thể được sử dụng mà không có chức năng cửa sổ (và không yêu cầuorder by
). Tên người dùng tốt đẹp!