2010-04-03 32 views
6

Tôi đang cố gắng lấy các bản ghi N hàng đầu (khi được một số cột X đặt hàng), nhưng có kết quả được đặt theo thứ tự ngược lại. Tuyên bố sau đây là không chính xác , nhưng có lẽ chứng minh những gì tôi sau:Chọn Bản ghi N Hàng đầu theo thứ tự X, nhưng có kết quả theo thứ tự ngược

SELECT * FROM (SELECT TOP 10 * FROM FooTable ORDER BY X DESC) ORDER BY X ASC 

Ví dụ, cột X có thể là một ID hoặc một dấu thời gian; Tôi muốn có 10 hồ sơ mới nhất nhưng muốn họ quay trở lại theo thứ tự thời gian tiến lên.

+1

Tại sao không 'CHỌN TOP 10 * FROM FooTable ORDER X ASC'? – Dor

+0

@Dor Bởi vì sau đó tôi sẽ nhận được 10 hồ sơ mới nhất, nhưng họ sẽ được trả lại theo thứ tự thời gian ngược lại. –

Trả lời

9
SELECT * FROM 
    (SELECT TOP 10 * FROM FooTable ORDER BY X DESC) as myAlias 
ORDER BY X ASC 

tức là bạn có thể cần bí danh trên truy vấn phụ của bạn, nhưng khác với bí danh bạn cần làm.

+0

Rất tốt, cảm ơn bạn. Mặc dù tôi không hoàn toàn hiểu tại sao SQL yêu cầu một bí danh khi không có tham chiếu đến nó ở đâu đó trong truy vấn. –

2

Hãy thử

SELECT * FROM 
(SELECT TOP 10 * FROM FooTable ORDER BY X DESC) temp --alias 
ORDER BY X 

hoặc với một biểu thức bảng chung (CTE)

WITH Temp AS (SELECT TOP 10 * FROM FooTable ORDER BY X DESC) 

SELECT * FROM temp 
ORDER BY X 
1

mệnh đề ORDER BY được sử dụng để ra lệnh tập hợp kết quả của một cột được chỉ định.

Truy vấn của bạn Select TOP 10 * from FooTable ORDER BY X DESC giả sử X là dấu thời gian, sẽ không trả về 10 hàng được chèn gần đây nhất. Nó sẽ trả về 10 hàng đầu như được lưu trữ (theo thứ tự nào) trong Cơ sở dữ liệu, và sau đó sẽ trả về tập kết quả của 10 hàng như vậy, theo thứ tự giảm dần. Do đó subquery của bạn nên được sửa đổi để

Select TOP 10 * from (Select * from FooTable ORDER BY DESC) as T

này nên thực hiện đầy đủ yêu cầu đầu tiên của bạn. Sau đó, bạn có thể sử dụng tập hợp kết quả này làm bí danh để quyết định thứ tự sắp xếp cuối cùng của mình.

Tôi hy vọng tôi đã hiểu bạn một cách chính xác, khi bạn nói "Tôi đang cố gắng để có được các hồ sơ đầu N (khi đặt hàng bởi một số cột X)"

0

Một giải pháp thay thế cho câu hỏi này cho tất cả các phi các phiên bản được hỗ trợ cho TOP từ khoá là sử dụng LIMIT. Ví dụ: -

SELECT * FROM 
    (SELECT * FROM FooTable ORDER BY X DESC LIMIT 10) as myAlias 
ORDER BY X ASC 
Các vấn đề liên quan