Tôi đang sử dụng một ứng dụng (MapServer - http://mapserver.org/ ) bao bọc các câu lệnh SQL, để câu lệnh ORDER BY nằm trong truy vấn bên trong. Ví dụ
SELECT * FROM (
SELECT ID, GEOM, Name
FROM t
ORDER BY Name
) as tbl
Ứng dụng này có nhiều trình điều khiển cơ sở dữ liệu khác nhau. Tôi chủ yếu sử dụng trình điều khiển MS SQL Server và SQL Server 2008. Điều này sẽ gây ra lỗi nếu tìm thấy ORDER BY trong truy vấn con.
Từ MS Docs (mặc dù điều này là dành cho SQL Server 2000 nhưng dường như nó vẫn được áp dụng):
Khi bạn sử dụng mệnh đề ORDER BY trong chế độ xem, hàm nội tuyến, bảng dẫn xuất hoặc truy vấn con, nó không đảm bảo đầu ra theo thứ tự. Thay vào đó, mệnh đề ORDER BY chỉ được sử dụng để đảm bảo rằng tập kết quả được tạo bởi toán tử Top có cấu trúc nhất quán. Mệnh đề ORDER BY chỉ đảm bảo một tập kết quả được đặt hàng khi nó được chỉ định trong câu lệnh SELECT ngoài cùng.
Tuy nhiên, cùng loại truy vấn khi chạy trong Postgres (9) và kết quả trả về của Oracle - với thứ tự như được xác định trong truy vấn con. Trong Postgres, kế hoạch truy vấn hiển thị kết quả được sắp xếp và ghi chú phát hành Postgres bao gồm mục ngụ ý các đơn đặt hàng truy vấn phụ được sử dụng:
Tránh sắp xếp khi truy vấn phụ ORDER BY khớp với truy vấn trên
http://en.wikipedia.org/wiki/Order_by tuyên bố:
Mặc dù một số hệ thống cơ sở dữ liệu cho phép đặc tả mệnh đề ORDER BY trong các mục con hoặc xem định nghĩa, sự hiện diện ở đó không có hiệu lực.
Tuy nhiên, từ việc kiểm tra kế hoạch truy vấn của riêng tôi:
- SQL Server 2008 không hỗ trợ ORDER BY trong truy vấn con
- Postgres 9 không hỗ trợ ĐẶT HÀNG B inNG trong truy vấn con
- Oracle 10g hỗ trợ ĐẶT HÀNG B inNG trong một truy vấn con
Vì vậy, câu hỏi của tôi là có bất kỳ liên kết nào có thể chính thức xác nhận hoặc từ chối rằng Postgres và Oracle không cho phép sắp xếp trong một truy vấn con?
ORDER BY
truy vấn con là dự phòng và không thực hiện sắp xếp không cần thiết.