2009-02-05 34 views

Trả lời

24

Không thể bạn làm điều gì đó như

SELECT ... FROM ... 
WHERE PK NOT IN (SELECT TOP 10 PK FROM ...) 
ORDER BY ... 

nó có thể không phải là hiệu quả nhưng đó là cách duy nhất ra khỏi đỉnh đầu của tôi tôi có thể nghĩ làm điều gì đó như thế. AFAIK không có mệnh đề "BOTTOM" trong SQL :)

+0

đã làm điều đó, cảm ơn! –

+0

Đó là một câu hỏi phỏng vấn cho tôi một lần. Tôi trả lời trong một thời trang tương tự –

6
SELECT ... FROM .... 
WHERE myID NOT IN 
    (SELECT TOP 10 myID FROM ... ORDER BY rankfield) 
ORDER BY sortfield 

Lưu ý rằng thứ tự sắp xếp của bạn có thể khác (nếu bạn muốn) khác với thứ tự xếp hạng của bạn.

Sửa: Một ý tưởng khác: Nếu bạn đã biết có bao nhiêu TỔNG hàng đã có, bạn có thể làm (giả sử 1000 dòng):

SELECT TOP 990 ... FROM .... ORDER BY sortfield DESC 

Chỉ cần lật các loại, và lấy phần còn lại.

Tất nhiên, nếu bạn vẫn muốn có kết quả theo thứ tự ban đầu, bạn sẽ phải làm điều gì đó ngớ ngẩn như:

SELECT ... 
FROM (SELECT TOP 990 ... FROM .... ORDER BY sortfield DESC) 
ORDER BY sortfield ASC 
+0

Tôi hy vọng rằng sau này sẽ nhanh hơn nhiều so với NOT IN, bởi vì NOT IN không sử dụng các chỉ mục một cách hiệu quả. Thật vậy, nó có thể nhanh hơn để có được số tiền kỷ lục với DCount() và sau đó nhận được phần còn lại của các hồ sơ. –

3

Điều này thường được thực hiện tốt hơn ở phía 'khách hàng', thay vào đó, DBMS lấy tất cả các hàng của bảng vào bản ghi ADO Classic, sau đó sử dụng thuộc tính Bộ lọc để xóa 10 hàng dựa trên tiêu chí, hoặc sắp xếp sau đó đặt sau đó bỏ qua 10 hàng đầu tiên/cuối cùng hoặc đặt độ dài trang là thích hợp rồi bỏ qua trang đầu tiên/cuối cùng, vv Không chỉ phụ thuộc vào số lượng hàng mà còn phụ thuộc vào ứng dụng đích. Ví dụ: Tôi biết rằng nếu đây là nguồn dữ liệu cho một báo cáo MS Access sau đó lọc ra các hàng không mong muốn có thể là rất nhiều rắc rối.

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