คอลัมน์คีย์การจัดเรียงแบบขยาย
สาเหตุที่สิ่งที่คุณต้องการทำไม่ได้ผลเป็นเพราะลำดับตรรกะของการดำเนินการใน SQLซึ่งสำหรับแบบสอบถามแรกของคุณคือ (แบบง่าย):
FROM MonitoringJob
SELECT Category, CreationDate
เช่นเพิ่มคอลัมน์คีย์การจัดเรียงแบบขยายที่เรียกว่า
ORDER BY CreationDate DESC
SELECT Category
เช่นลบคอลัมน์คีย์การเรียงลำดับเพิ่มเติมอีกครั้งจากผลลัพธ์
ดังนั้นด้วยคุณลักษณะคอลัมน์คีย์การเรียงลำดับแบบขยายมาตรฐานของ SQL จึงเป็นไปได้โดยสิ้นเชิงที่จะเรียงลำดับตามสิ่งที่ไม่อยู่ในSELECT
อนุประโยคเนื่องจากมีการเพิ่มไว้ชั่วคราวในเบื้องหลัง
แล้วทำไมถึงใช้ไม่ได้กับDISTINCT
?
หากเราเพิ่มการDISTINCT
ดำเนินการจะเพิ่มระหว่างSELECT
และORDER BY
:
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
แต่ตอนนี้ด้วยคอลัมน์คีย์การจัดเรียงแบบขยาย CreationDate
ความหมายของการDISTINCT
ดำเนินการได้เปลี่ยนไปดังนั้นผลลัพธ์จะไม่เหมือนเดิมอีกต่อไป นี่ไม่ใช่สิ่งที่เราต้องการดังนั้นทั้งมาตรฐาน SQL และฐานข้อมูลที่เหมาะสมทั้งหมดจึงห้ามการใช้งานนี้
วิธีการแก้ปัญหา
สามารถจำลองด้วยไวยากรณ์มาตรฐานได้ดังนี้
SELECT Category
FROM (
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
) t
ORDER BY CreationDate DESC
หรือเพียงแค่ (ในกรณีนี้) ดังที่แสดงโดยPrutswonder
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
ORDER BY CreationDate DESC
ฉันได้ blogged เกี่ยวกับ SQL ที่แตกต่างและ ORDER BY อื่น ๆ ในรายละเอียดที่นี่