2010-01-20 28 views

Trả lời

12

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 ...

11

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 
1

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.

1

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).

-3

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.

+0

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

+0

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

+0

Đú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

3

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

1

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.

1

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.

2

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

Các vấn đề liên quan