2011-10-08 31 views
5

Tôi muốn ORDER BY kết quả của truy vấn MINUS.Làm thế nào để bạn ORDER BY trong một truy vấn bằng cách sử dụng MINUS?

nỗ lực đầu tiên của tôi không hoạt động:

SELECT * 
FROM Table1 
MINUS 
SELECT * 
FROM table2 
WHERE table2.foo = 'bar' 
ORDER BY foo 

Làm thế nào bạn sẽ làm điều đó?

oops: Tôi đã làm ORDER BY table2.foo thay vì chỉ ORDER BY foo. Bây giờ nó hoạt động.

+0

chúng đều là cùng một bảng tôi đoán? vậy tại sao bạn sử dụng trừ? – frail

+0

xin lỗi, ví dụ xấu. Tôi đã thay đổi nó – ladookie

+0

những gì bạn đang làm là cơ bản là một hoạt động tốn kém, đòi hỏi phải quét toàn bộ bảng. vì vậy nếu bạn có thể đăng một số dữ liệu ví dụ có thể nó có thể được giải quyết với một tham gia. (tùy thuộc vào dữ liệu) Và bạn có cần tất cả các dữ liệu? bạn có thể có giới hạn sẽ tránh quét toàn bộ bảng – frail

Trả lời

8

Tuy nhiên, để trả lời câu hỏi của bạn, bạn có thể sử dụng một với truy vấn:

with tmp_minus as (
    SELECT * 
    FROM Table1 
    MINUS 
    SELECT * 
    FROM table2 
    WHERE table2.foo = 'bar' 
) 
select * from tmp_minus 
ORDER BY foo 

Bạn cũng sẽ có thể làm một subselect:

select * from (
    SELECT * 
    FROM Table1 
    MINUS 
    SELECT * 
    FROM table2 
    WHERE table2.foo = 'bar' 
) tmp_minus 
ORDER BY foo 
1

Nếu TRỪ được thay thế bằng UNION, ORDER BY sẽ áp dụng cho kết quả của UNION. Bạn có chắc chắn đó không phải là những gì bạn nhận được với MINUS?

Nếu nó không làm việc trực tiếp, sau đó:

SELECT result.* 
    FROM (SELECT * 
      FROM Table1 
     MINUS 
     SELECT * 
      FROM table2 
     WHERE table2.foo = 'bar') AS result 
ORDER BY foo; 

Tuy nhiên, tôi nghĩ rằng đây là khó có thể là cần thiết.

1

Bạn có thể sử dụng vị trí thay vì tên cột. Giả sử rằng foo là cột đầu tiên trong kết quả:

SELECT * 
FROM Table1 
MINUS 
SELECT * 
FROM table2 
WHERE table2.foo = 'bar' 
ORDER BY 1 

Bạn thường không muốn kết quả phụ thuộc vào thứ tự cột cụ thể, vì vậy tôi sẽ chỉ sử dụng kết quả này cho truy vấn adhoc.

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