2012-06-13 48 views
5

有沒有在SQL Server中會告訴你,如果TOP生效關鍵字或元信息?Sql Server TOP - 用?

EX: 
Select TOP 5 * From Stuff 

RESULT: 5 rows 

確定是否有6個或更多的最佳方法是什麼?

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

但我關心的一個單獨的調用來檢索計數,因爲有實際的查詢比這要複雜得多,並在一張大桌子。

謝謝!

+0

「生效」以什麼方式?這意味着它實際上限制了你的結果集?只要算你回來的東西。 – bluevector

+0

@jonnyGold計算他回來的東西不會告訴他是否有更多的行比他要求。 – ean5533

+0

@ ean5533因此,我要求澄清「生效」的含義? – bluevector

回答

7

嗯,你可以選擇最上面的N + 1(其中N在你的例子是5,那麼在你的榜樣選擇前6名),丟棄最後一個在你的客戶端代碼中,並且使用第六個元素的存在來確定如果首先使用N,TOP是否會產生效果。不過,我不確定這樣做有多大價值。

+5

+1這是[space space pens]中的一支鉛筆(http://en.wikipedia.org/wiki/Space_Pen)。 – mafue

+0

+1這可能是最有效的方法。 –

+0

哇。這是一個漫長的一天。不知道那是怎麼一回事。 – LethalFlipper

0

你可以附加一個布爾值,到時以相同的邏輯子查詢的COUNT(*),當它返回一個值小於或等於5返回的值大於5,假返回true查詢。

這將增加你需要返回的數據信息。如果你關心性能,並且查詢非常複雜,那麼這可能不會對單獨的查詢產生很大的改進,但應該至少有一點改進。

0

有沒有辦法做到這一點沒有兩個查詢或做表演殺死recacluations ...

Select TOP 5 * From Stuff 

Select Count(*) From Stuff 
+1

事實並非如此,COUNT()OVER()可以做到這一點 –

+0

@AaronBertrand我想看到的查詢計劃,看看哪一種方式更effecient。 – bluevector

+1

隨意。在迄今爲止所提出的所有解決方案中,當我一起執行所有解決方案時,卡爾和馬丁的每個解決方案佔總成本的4%。 RedFilter的股價上漲1%至5%,HLGEM的股價上漲42%,其他44%的股價上漲。我對sys.all_columns做了我的測試。 –

12

沒有什麼自動就可以使用。你可以使用的東西沿着這些線路

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不,因爲他的'WITH'只選了6行。 – ean5533

+0

@ ean5533正確,但OP的「WITH」可能不是。我可能會演示這個使用變量。 –

+0

@AaronBertrand - OP應該有一個「TOP 6」(或者「TOP N + 1」),這樣它可以在第6行之後停止掃描。 –

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

請注意,我刪除了使用SELECT *的SQL反模式,並且在獲取TOP N記錄時未使用ORDER BY。 – HLGEM

0
select top 5 *, 
    case when count(*) OVER() <= 5 then 'yes' else 'no' end as AllRecordsReturned 
from supportContacts