ฉันกำลังใช้แอปพลิเคชัน (MapServer - http://mapserver.org/ ) ที่ล้อมรอบคำสั่ง SQL เพื่อให้คำสั่ง ORDER BY อยู่ในแบบสอบถามภายใน เช่น
SELECT * FROM (
SELECT ID, GEOM, Name
FROM t
ORDER BY Name
) as tbl
แอปพลิเคชันมีไดรเวอร์ฐานข้อมูลที่แตกต่างกันมากมาย ฉันใช้ไดรเวอร์ MS SQL Server เป็นหลักและ SQL Server 2008 ส่วนใหญ่จะเกิดข้อผิดพลาดหากพบคำสั่งซื้อในแบบสอบถามย่อย
จาก MS Docs (แม้ว่าจะใช้กับ SQL Server 2000 แต่ก็ดูเหมือนว่าจะใช้):
เมื่อคุณใช้ส่วนคำสั่ง ORDER BY ในมุมมองฟังก์ชั่นอินไลน์ตารางที่ได้รับหรือแบบสอบถามย่อยมันไม่รับประกันผลลัพธ์ที่สั่งซื้อ แต่คำสั่งย่อย ORDER BY ใช้เพื่อรับประกันว่าชุดผลลัพธ์ที่สร้างขึ้นโดยผู้ดำเนินการด้านบนเท่านั้นที่มีการแต่งหน้าที่สอดคล้องกัน ส่วนคำสั่ง ORDER BY รับประกันเฉพาะชุดผลลัพธ์ที่ได้รับคำสั่งเมื่อมีการระบุไว้ในคำสั่ง SELECT ที่อยู่นอกสุด
อย่างไรก็ตามแบบสอบถามชนิดเดียวกันเมื่อเรียกใช้ใน Postgres (9) และ Oracle ส่งคืนผลลัพธ์ - โดยมีลำดับตามที่กำหนดไว้ในแบบสอบถามย่อย ใน Postgres แผนแบบสอบถามจะแสดงผลลัพธ์จะถูกจัดเรียงและบันทึกการออกรุ่นของ Postgres จะรวมรายการที่ใช้คำสั่งแบบสอบถามย่อย:
หลีกเลี่ยงการเรียงลำดับเมื่อแบบสอบถามย่อย ORDER BY จับคู่แบบสอบถามบน
http://en.wikipedia.org/wiki/Order_byกล่าวว่า:
แม้ว่าระบบฐานข้อมูลบางระบบจะอนุญาตให้ระบุข้อกำหนดของคำสั่งย่อย ORDER BY ในการเลือกย่อยหรือดูคำจำกัดความการมีอยู่ไม่มีผลใด ๆ
อย่างไรก็ตามจากการตรวจสอบแผนแบบสอบถามของฉันเอง:
- SQL Server 2008 ไม่สนับสนุน ORDER BY ในแบบสอบถามย่อย
- Postgres 9 รองรับ ORDER BY ในแบบสอบถามย่อย
- Oracle 10g รองรับ ORDER BY ในแบบสอบถามย่อย
ดังนั้นคำถามของฉันมีลิงก์ใด ๆ ที่สามารถยืนยันหรือปฏิเสธได้อย่างเป็นทางการว่า Postgres และ Oracle ไม่อนุญาตให้เรียงลำดับในแบบสอบถามย่อย?
ORDER BY
ในแบบสอบถามย่อยนั้นซ้ำซ้อนและไม่ทำการเรียงลำดับที่ไม่จำเป็น