Các cột khóa sắp xếp mở rộng
Lý do tại sao những gì bạn muốn làm không hoạt động là do thứ tự logic của các hoạt động trong SQL , đối với truy vấn đầu tiên của bạn, là (đơn giản hóa):
FROM MonitoringJob
SELECT Category, CreationDate
tức là thêm một cột được gọi là khóa sắp xếp mở rộng
ORDER BY CreationDate DESC
SELECT Category
tức là loại bỏ cột khóa sắp xếp mở rộng một lần nữa khỏi kết quả.
Vì vậy, nhờ tính năng cột khóa sắp xếp mở rộng tiêu chuẩn SQL , bạn hoàn toàn có thể sắp xếp thứ tự theo thứ gì đó không có trong SELECT
mệnh đề, bởi vì nó tạm thời được thêm vào nó ở phía sau.
Vì vậy, tại sao điều này không hoạt động với DISTINCT
?
Nếu chúng tôi thêm DISTINCT
thao tác, nó sẽ được thêm vào giữa SELECT
và ORDER BY
:
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Nhưng bây giờ, với cột khóa sắp xếp mở rộng CreationDate
, ngữ nghĩa của DISTINCT
thao tác đã được thay đổi, do đó kết quả sẽ không còn như cũ. Đây không phải là những gì chúng tôi muốn, vì vậy cả tiêu chuẩn SQL và tất cả các cơ sở dữ liệu hợp lý đều cấm việc sử dụng này.
Cách giải quyết
Nó có thể được mô phỏng với cú pháp tiêu chuẩn như sau
SELECT Category
FROM (
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
) t
ORDER BY CreationDate DESC
Hoặc, chỉ đơn giản (trong trường hợp này), như được hiển thị bởi Prutswonder
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
ORDER BY CreationDate DESC
Tôi đã viết blog về SQL DISTINCT và ORDER BY chi tiết hơn ở đây .