ฐานข้อมูลส่วนใหญ่ค่อนข้างชัดเจนเกี่ยวกับข้อเท็จจริงที่ว่าORDER BY
ในแบบสอบถามย่อยเป็นอย่างใดอย่างหนึ่ง:
- ไม่อนุญาต: เช่น SQL Server, Sybase SQL Anywhere (เว้นแต่จะได้รับการสนับสนุน
TOP
หรือOFFSET .. FETCH
)
- ความหมาย: เช่น PostgreSQL, DB2 (อีกครั้งยกเว้นว่ามี
OFFSET .. FETCH
หรือLIMIT
)
นี่คือตัวอย่างจากคู่มือ DB2 LUW (เหมืองเน้นที่)
คำสั่งย่อย ORDER BY ในการเลือกย่อยจะไม่ส่งผลกระทบต่อลำดับของแถวที่ส่งคืนโดยแบบสอบถาม ส่วนคำสั่ง ORDER BY จะมีผลกับลำดับของแถวที่ส่งคืนหากมีการระบุใน fullselect สุดสุด
ถ้อยคำที่ค่อนข้างชัดเจนเช่นเดียวกับของ PostgreSQL :
หากไม่ได้เลือกการเรียงลำดับแถวจะถูกส่งกลับในลำดับที่ไม่ระบุ การสั่งซื้อที่เกิดขึ้นจริงในกรณีที่ว่าจะขึ้นอยู่กับการสแกนและเข้าร่วมประเภทแผนและสั่งซื้อบนดิสก์แต่มันต้องไม่เป็นที่พึ่ง สามารถรับประกันการสั่งซื้อเอาต์พุตเฉพาะเมื่อขั้นตอนการจัดเรียงนั้นถูกเลือกอย่างชัดเจน
จากสเปคนี้สามารถติดตามได้ว่าการสั่งซื้อใด ๆ ที่เกิดขึ้นจากORDER BY
ข้อในตารางที่ได้รับนั้นเป็นเพียงอุบัติเหตุและอาจตรงกับการสั่งซื้อที่คาดหวังของคุณ (ซึ่งจะทำในฐานข้อมูลส่วนใหญ่ในตัวอย่างเล็กน้อย) นี้.
หมายเหตุด้านบน DB2:
โดยเฉพาะอย่างยิ่งDB2 มีคุณสมบัติที่รู้จักน้อยกว่าที่เรียกว่าORDER BY ORDER OF <table-designator>
ซึ่งสามารถใช้ดังนี้:
SELECT C1 FROM
(SELECT C1 FROM T1
UNION
SELECT C1 FROM T2
ORDER BY C1 ) AS UTABLE
ORDER BY ORDER OF UTABLE
ในกรณีพิเศษนี้การเรียงลำดับของตารางที่ได้รับสามารถนำกลับมาใช้ใหม่ได้อย่างชัดเจนใน SELECT ส่วนใหญ่ด้านนอก
หมายเหตุด้านบน Oracle:
เป็นเวลาหลายปีแล้วที่ Oracle ได้ใช้การให้OFFSET
เลขหน้าโดยใช้การROWNUM
คำนวณซึ่งสามารถคำนวณได้อย่างสมเหตุสมผลหลังจากสั่งซื้อตารางที่ได้รับ:
SELECT *
FROM (
SELECT rownum AS rn, t.* -- ROWNUM here depends on the derived table's ordering
FROM (
SELECT * FROM table ORDER BY time DESC
) t
) t
WHERE rn BETWEEN 10 AND 20
เป็นที่คาดหวังได้ว่าอย่างน้อยเมื่อมีROWNUM
การสืบค้นในอนาคต Oracle เวอร์ชันในอนาคตจะไม่ทำลายพฤติกรรมนี้เพื่อไม่ทำลายมรดกทั้งหมดของ Oracle SQL ที่มีอยู่ซึ่งยังไม่ได้ทำการโยกย้ายไปยังที่ต้องการและอื่น ๆ อีกมากOFFSET .. FETCH
ไวยากรณ์มาตรฐาน SQL ที่อ่านได้:
SELECT * FROM table ORDER BY time DESC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY