2012-06-13 38 views
5

Có một từ khóa hoặc metainformation trong SQL Server mà sẽ cho bạn biết nếu TOP có hiệu lực?Sql Server TOP - được sử dụng?

EX: 
Select TOP 5 * From Stuff 

RESULT: 5 rows 

Cách tốt nhất để xác định xem có từ 6 trở lên không?

I could do: 
SELECT TOP 6 count(*) FROM Stuff 

Nhưng tôi lo ngại về một cuộc gọi riêng biệt để lấy số lượng vì có truy vấn thực tế là nhiều phức tạp hơn này và trên một chiếc bàn lớn.

Cảm ơn!

+0

"Hiệu lực" theo cách nào? Có nghĩa là nó thực sự hạn chế tập kết quả của bạn? Chỉ cần đếm những gì bạn đã trở lại. – bluevector

+0

@jonnyGold Đếm những gì anh ta quay lại sẽ không nói cho anh ta biết nếu có nhiều hàng hơn anh ta yêu cầu. – ean5533

+0

@ ean5533 Do đó tôi yêu cầu làm rõ về ý nghĩa của "hiệu lực"? – bluevector

Trả lời

7

Vâng, bạn có thể chọn đầu N + 1 (trong đó N trong ví dụ của bạn là 5, vì vậy trong ví dụ của bạn chọn top 6) và loại bỏ mã cuối cùng trong mã máy khách của bạn, và sử dụng sự hiện diện của một phần tử thứ sáu để xác định xem TOP có có hiệu lực không khi bạn sử dụng N ngay từ đầu. Tôi không chắc chắn có nhiều giá trị làm điều này, tuy nhiên.

+5

+1 Đây là một cây bút chì trong số [không gian bút] (http://en.wikipedia.org/wiki/Space_Pen). – mafue

+0

+1 Có lẽ cách hiệu quả nhất để làm điều này. –

+0

wow. Đó là một ngày dài. Không chắc điều đó không vượt qua được suy nghĩ của tôi. – LethalFlipper

0

Bạn có thể thêm giá trị boolean vào truy vấn trả về true khi COUNT (*) của truy vấn phụ có cùng logic trả về giá trị lớn hơn 5 và sai khi trả về giá trị 5 trở xuống.

Điều này sẽ thêm thông tin bạn cần vào dữ liệu được trả lại. Nếu bạn lo ngại về hiệu suất và truy vấn cực kỳ phức tạp, điều này có thể không đưa ra cải thiện lớn so với các truy vấn riêng biệt, nhưng nên cải thiện nhỏ nhất.

0

Không có cách nào để làm điều đó mà không cần hai truy vấn hoặc làm hiệu suất giết recacluations ...

Select TOP 5 * From Stuff 

Select Count(*) From Stuff 
+1

Không đúng, COUNT() OVER() có thể thực hiện điều này –

+0

@AaronBertrand Tôi muốn xem các kế hoạch truy vấn để xem cách nào hiệu quả hơn. – bluevector

+1

Hãy thoải mái. Trong tất cả các giải pháp trình bày cho đến nay, khi tôi thực hiện tất cả cùng nhau, Carl's và Martin đi ra đến 4% tổng chi phí mỗi. RedFilter là 1% nhiều hơn 5%, HLGEM là 42%, và đề xuất của bạn kết hợp với 44% còn lại. Tôi đã thử nghiệm của tôi chống lại sys.all_columns. –

12

Không có gì tự động bạn có thể sử dụng được. Bạn có thể sử dụng một cái gì đó dọc theo những dòng

DECLARE @N INT = 5; 

WITH T 
    AS (SELECT TOP (@N + 1) * 
     FROM master..spt_values 
     ORDER BY number) 
SELECT TOP (@N) *, 
      CASE 
       WHEN Count(*) OVER() = (@N + 1) THEN 1 
       ELSE 0 
      END AS MoreRecords 
FROM T 
ORDER BY number 
+3

@AaronBertrand Không, bởi vì 'WITH' chỉ chọn 6 hàng. – ean5533

+0

@ ean5533 Phải, nhưng OP WITH 'WITH' có thể không. Tôi có lẽ sẽ chứng minh điều này bằng cách sử dụng một biến. –

+0

@AaronBertrand - OP phải có 'TOP 6' (hoặc 'TOP N + 1') để nó có thể dừng quét sau hàng thứ 6. –

0
SELECT TOP 5 Field1, field2, recordcount 
FROM Stuff 
CROSS JOIN (SELECT COUNT(*) as recordcount FROM Stuff) a 
ORDER BY Field1 
+0

Lưu ý rằng tôi đã xóa các mẫu đối tượng SQL bằng cách sử dụng SELECT * và không sử dụng ORDER BY khi nhận được bản ghi TOP N. – HLGEM

0
select top 5 *, 
    case when count(*) OVER() <= 5 then 'yes' else 'no' end as AllRecordsReturned 
from supportContacts 
Các vấn đề liên quan