2012-06-13 25 views
5

SQL Server'da, TOP'un etkili olup olmadığını size anlatacak bir anahtar kelime mi, yoksa metaforformasyon var mı?Sql Server TOP - kullanılmış?

EX: 
Select TOP 5 * From Stuff 

RESULT: 5 rows 

6 veya daha fazla olup olmayacağını belirlemenin en iyi yolu nedir? gerçek sorgu çok daha karmaşık bu olandan ve büyük bir masa üzerinde olduğundan

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

Ama sayısı almak için ayrı bir çağrı konusunda endişeliyim.

Teşekkürler!

+0

"Took etkisi" ne şekilde? Aslında sonuç kümenizi sınırlandırmış mıdır? Sadece geri aldığın şeyi say. – bluevector

+0

@jonnyGold Geriye dönüp bakmadığı şey, ona istediğinden daha fazla satır olup olmadığını söyleyemezdi. – ean5533

+0

@ ean5533 Bu yüzden "etkili oldu" anlamını açıklığa kavuşturmak istiyorum? – bluevector

cevap

7

Eh boyunca bir şey kullanın ve atın olabilir Müşteri kodunuzda sonuncusu ve TOPLAM'ın bir etkisi olup olmadığını belirlemek için altıncı bir öğenin varlığını kullanın. Ancak bunu yapmanın çok değerli olduğuna emin değilim.

+5

+1 Bu, [boşluk kalemleri] arasında bir kalemdir (http://en.wikipedia.org/wiki/Space_Pen). – mafue

+0

+1 Muhtemelen bunu yapmanın en verimli yolu. –

+0

vay. Uzun bir gün oldu. Bunun aklımdan nasıl geçmediğinden emin değilim. – LethalFlipper

0

Aynı mantıka sahip bir alt sorgunun COUNT (*) değeri 5'ten büyük bir değer döndürdüğünde ve 5 veya daha az bir değer döndürdüğünde yanlış olduğunda, döndüren sorguya bir boolean değeri ekleyebilirsiniz.

Bu, ihtiyaç duyduğunuz bilgileri döndürülen verilere ekler. Performans hakkında endişeleriniz varsa ve sorgu son derece karmaşıksa, bu, ayrı sorgular üzerinde büyük bir gelişme sağlamayabilir, ancak en azından küçük bir iyileşme sağlamalıdır.

0

kullanabileceğiniz otomatik bir şey yok ...

Select TOP 5 * From Stuff 

ve

Select Count(*) From Stuff 
+1

Doğru değil, COUNT() OVER() bunu yapabilir –

+0

@AaronBertrand Hangi yolun daha verimli olduğunu görmek için sorgu planlarını görmek istiyorum. – bluevector

+1

Hissedin. Şimdiye kadar sunulan tüm çözümlerden, hep birlikte yürüttüğümde, Carl'ın ve Martin'in her birinin toplam maliyetinin% 4'üne çıktı. RedFilter's% 5 daha fazla% 5, HLGEM's% 42 ve öneriniz diğer% 44 için kombine. Testlerimi sys.all_columns'a karşı yaptım. –

12

iki sorguları olmadan veya performans öldürme recacluations yapıyor yapmak için hiçbir yolu yoktur. Sen (örneğin N 5 olduğu, sizin örnekte böylece üst 6'yı seçin) belirleyerek en popüler N + 1 seçebilir bu satırların

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 Hayır, çünkü onun "WITH" sadece 6 satır seçti. – ean5533

+0

@ ean5533 Doğru, ancak OP'nin 'WITH''i olmayabilir. Bunu bir değişken kullanarak gösterebilirdim. –

+0

@AaronBertrand - OP'ler, 6. satırdan sonra taramayı durdurabilmek için 'TOP 6' (veya' TOP N + 1') olmalıdır. –

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

SELECT * kullanarak SQL antipatürelerini kaldırdığımı ve TOP N kayıtlarını alırken SİPARİŞ BY kullanarak kullanmadığımı unutmayın. – HLGEM

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