2012-06-13 17 views
5

C'è una parola chiave o una metainformazione in SQL Server che ti dirà se TOP ha avuto effetto?Sql Server TOP - usato?

EX: 
Select TOP 5 * From Stuff 

RESULT: 5 rows 

Qual è il modo migliore per determinare se ci sarebbero stati 6 o più?

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

ma sono preoccupati per una chiamata separata per recuperare il conteggio perché non c'è domanda reale è molto più complicato di questo e su un grande tavolo.

Grazie!

+0

"Ha preso effetto" in che modo? Significa che in realtà ha limitato il tuo set di risultati? Conta solo quello che hai ottenuto. – bluevector

+0

@jonnyGold Il conteggio di ciò che è tornato non gli avrebbe detto se c'erano più file disponibili di quelle richieste. – ean5533

+0

@ ean5533 Quindi la mia richiesta di chiarimenti sul significato di "ha avuto effetto"? – bluevector

risposta

7

Beh, si potrebbe selezionare la parte superiore N + 1 (dove N nel tuo esempio è 5, quindi nel tuo esempio selezionare la parte superiore 6) e scartare l'ultimo nel tuo codice cliente, e usa la presenza di un sesto elemento per determinare se TOP avrebbe avuto un effetto se avessi usato N in primo luogo. Non sono sicuro che ci sia molto valore nel farlo, comunque.

+5

+1 Questa è una matita tra [penne spaziali] (http://en.wikipedia.org/wiki/Space_Pen). – mafue

+0

+1 Probabilmente il modo più efficiente per farlo. –

+0

wow. È stata una lunga giornata. Non sono sicuro di come non sia passato per la testa. – LethalFlipper

0

È possibile aggiungere un valore booleano alla query che restituisce true quando COUNT (*) di una sottoquery con la stessa logica restituisce un valore maggiore di 5 e falso quando restituisce un valore 5 o inferiore.

Ciò aggiungerebbe le informazioni necessarie ai dati da restituire. Se si è preoccupati per le prestazioni e la query è estremamente complicata, questo potrebbe non fornire un notevole miglioramento rispetto a query separate, ma dovrebbe dare nel migliore dei casi un miglioramento minore.

0

Non c'è modo di farlo senza due query o fare recacluations prestazioni uccidendo ...

Select TOP 5 * From Stuff 

e

Select Count(*) From Stuff 
+1

Non è vero, COUNT() OVER() può fare questo –

+0

@AaronBertrand Mi piacerebbe vedere i piani di query per vedere in che modo è più efficiente. – bluevector

+1

Sentiti libero. Di tutte le soluzioni presentate fino ad ora, quando eseguo tutti insieme, Carl's e Martin sono arrivati ​​al 4% del costo complessivo ciascuno. RedFilter's è dell'1% in più al 5%, quello di HLGEM è del 42% e il tuo suggerimento combinato per il restante 44%. Ho fatto i miei test contro sys.all_columns. –

12

non è automatica è possibile utilizzare. Si potrebbe utilizzare qualcosa in questo senso

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 No, perché il suo 'WITH' ha selezionato solo 6 righe. – ean5533

+0

@ ean5533 Giusto, ma l'OP 'WITH' potrebbe non. Probabilmente lo dimostrerei usando una variabile. –

+0

@AaronBertrand - Gli OP dovrebbero avere un 'TOP 6' (o' TOP N + 1') in modo che possa interrompere la scansione dopo la sesta riga. –

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

Nota che ho rimosso gli antipattern SQL dall'uso di SELECT * e non utilizzando un ORDER BY quando ho ottenuto i record TOP N. – HLGEM

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