Có lý do nào tại sao hoặc tại sao bạn không nên thực hiện 'đơn đặt hàng' trong truy vấn phụ?Thứ tự theo mệnh đề được phép trong truy vấn phụ
Trả lời
Có: Nó không nên được thực hiện, bởi vì nó không có ý nghĩa khái niệm.
Truy vấn phụ sẽ được sử dụng trong một số truy vấn bên ngoài (nếu không nó sẽ là vô nghĩa) và truy vấn bên ngoài đó sẽ phải thực hiện thứ tự, vì vậy không có điểm nào yêu cầu truy vấn phụ.
Điều này là do kết quả truy vấn trong SQL sẽ không theo thứ tự cụ thể, trừ khi bạn sử dụng ORDER rõ ràng. Vì vậy, ngay cả khi bạn đã sử dụng ORDER trong truy vấn phụ, bạn không đảm bảo rằng điều này sẽ ảnh hưởng đến thứ tự của các kết quả từ truy vấn bên ngoài; vì vậy nó là vô nghĩa.
Tất nhiên, nó có thể tạo sự khác biệt trong một số RDBMS cụ thể vì việc triển khai thực hiện, nhưng điều đó sẽ được thực hiện cụ thể và không phải là điều bạn nên dựa vào.
Chỉnh sửa: Tất nhiên, nếu bạn sử dụng TOP hoặc LIMIT trong truy vấn con, bạn sẽ cần sử dụng ORDER. Nhưng đó không phải là tiêu chuẩn SQL anyway ...
Bạn nên sử dụng nó nếu truy vấn phụ sử dụng một số loại LIMIT
/TOP
.
SQL Server
sẽ không cho phép nó trừ khi subquery chứa TOP
hoặc FOR XML
khoản cũng như:
-- Fails
WITH q(id) AS
(
SELECT 1
UNION ALL
SELECT 2
)
SELECT *
FROM (
SELECT *
FROM q
ORDER BY
id DESC
) q2
-- Succeeds
WITH q(id) AS
(
SELECT 1
UNION ALL
SELECT 2
)
SELECT *
FROM (
SELECT TOP 1 *
FROM q
ORDER BY
id DESC
) q2
-- Succeeds, but ORDER BY is ignored
WITH q(id) AS
(
SELECT 1
UNION ALL
SELECT 2
)
SELECT *
FROM (
SELECT TOP 100 PERCENT *
FROM q
ORDER BY
id DESC
) q2
Bạn có thể làm điều đó, nhưng tôi sẽ không thường trừ khi bạn có nhu cầu.
Các optimizer sẽ bỏ qua nó (hoặc ném ra một lỗi?)
Xem "Intermediate materialisation" đối với một số tập quán.
Tùy thuộc vào kích thước của truy vấn phụ, nó sẽ tác động đến hiệu suất ở mức độ biến đổi.
Đơn đặt hàng không quan trọng trên truy vấn phụ. Bạn sẽ có thể di chuyển thứ tự theo phần để truy vấn bên ngoài (mà phải là một trong những trở về kết quả cuối cùng).
Hoàn toàn hợp pháp. I E. SELECT id FROM entries WHERE author_id IN (SELECT id FROM authors ORDER BY name DESC)
nhưng bạn sẽ thực sự nhận được kết quả tương tự thường.
Trừ khi bạn sử dụng trên nó không phải là hữu ích vì bạn sẽ được đặt hàng trong truy vấn bên ngoài nào
Không ORDER BY là hợp lệ trong một subquery khi bạn đang quan tâm đến một tập hợp con của dữ liệu tổng thể, do đó bạn luôn cần a TOP
(Máy chủ SQL). Không có điểm nào có ORDER BY nếu không có TOP trong truy vấn con bởi vì thứ tự tổng thể của các kết quả được xử lý bởi truy vấn bên ngoài.
Bạn không nên sử dụng nó. Theo 'Nghệ thuật SQL', điều này thực sự ngăn cản trình tối ưu hóa thực hiện các tối ưu hóa khác nhau mà nó có thể làm khác bởi vì điều này trước khi biến đổi dữ liệu.
Những người thông minh hơn nói rằng đó không phải là cách thích hợp/hợp lệ để thực hiện. Trong trường hợp của tôi, SELECT TOP 100 PERCENT trong truy vấn phụ đã giải quyết được vấn đề.
Chúc mừng
- 1. thứ tự một truy vấn mysql theo thứ tự abc
- 2. Thứ tự đúng của các mệnh đề này khi viết một truy vấn SQL là gì?
- 3. Sắp xếp tùy chỉnh theo thứ tự SQL theo mệnh đề?
- 4. Thứ tự trong truy vấn phụ có được bảo đảm để được giữ nguyên không?
- 5. Thứ tự MySQL được đánh giá theo thứ tự nào?
- 6. Thứ tự truy vấn Oracle PL/SQL Theo vấn đề với phân biệt
- 7. truy vấn SQL mệnh đề where
- 8. Thứ tự theo mệnh đề hoạt động như thế nào nếu hai giá trị bằng nhau?
- 9. SELECT của khung nhìn chứa truy vấn phụ trong mệnh đề FROM
- 10. Tham số trong truy vấn với mệnh đề trong?
- 11. Ví dụ về mệnh đề Oracle PIVOT với truy vấn phụ
- 12. ORA-00907 Thiếu vấn đề ngoặc đơn phải - chọn theo thứ tự bên trong chèn truy vấn
- 13. thứ tự của bảng trong tham gia truy vấn
- 14. Hibernate Vấn đề bộ nhớ đệm truy vấn cấp hai với cùng một mệnh đề
- 15. C# Tham số truy vấn MySQL với mệnh đề `in`
- 16. Thứ tự kết quả truy vấn XPath
- 17. Kết quả của truy vấn LINQ luôn được đảm bảo theo đúng thứ tự?
- 18. cách thêm mệnh đề WHERE vào Truy vấn trên android
- 19. Truy vấn MySQL - nhiều mệnh đề WHERE trên 1 cột
- 20. Thực thể khung - Truy vấn LINQ theo thứ tự và nhóm theo
- 21. truy vấn cập nhật với mệnh đề where
- 22. Truy vấn được đặt tên giống như trong mệnh đề where
- 23. truy vấn cơ sở dữ liệu theo thứ tự dọc theo một đường cong
- 24. Chuỗi tổng hợp theo thứ tự giảm dần trong truy vấn PostgreSQL
- 25. mệnh đề SQL cho phép nối ngoài bên trái
- 26. Kiểm tra ràng buộc - Truy vấn phụ không được phép trong ngữ cảnh này
- 27. Lỗi trình tự trong sql. Số thứ tự không được phép ở đây
- 28. Truy vấn con của SQLAlchemy trong mệnh đề từ mà không cần tham gia
- 29. Kết quả truy vấn con của Mysql trong mệnh đề "where"
- 30. Vấn đề SQL với hàm tổng hợp ở mệnh đề
Thông thường? Bạn có thể đưa ra bất kỳ trường hợp nào mà kết quả sẽ khác nhau không? – sleske
Nó sẽ khác nếu bạn thêm một câu lệnh LIMIT vào lựa chọn của bạn. Trong trường hợp này, nếu bạn muốn xem tất cả các mục từ 5 tác giả hàng đầu theo tên, bạn sẽ thay đổi lựa chọn của bạn thành (SELECT id FROM authors ORDER BY tên DESC LIMIT 5). – loginx
Đúng. Với TOP/LIMIT nó tạo ra sự khác biệt (và cần thiết, đôi khi thậm chí cần thiết). Nếu không, nó không tạo ra sự khác biệt. – sleske