Gesamtzahl der Zeilen einer Abfrage

Ich habe eine sehr große Abfrage, die nur die Top 10 Ergebnisse zurückgeben soll:

Wähle Top 10 ProductId aus …..

Das Problem ist, dass ich auch die Gesamtzahl der Ergebnisse, die die Kriterien ohne die 'Top 10' entsprechen, aber in der gleichen time gilt es als unangenehm, alle Zeilen zurückzukehren (wir sprechen von etwa 100 Tausend Ergebnisse.

Gibt es einen path, um die Gesamtzahl der Zeilen, die von der vorherigen Abfrage betroffen sind, entweder in ihm oder nach Worten, ohne es wieder laufen zu bekommen?

PS: bitte keine Temp-Tische von 100 000 Zeilen :))

Dump die Zählung in einer variables und gib das zurück

declare @count int select @count = count(*) from ..... --same where clause as your query --now you add that to your query..of course it will be the same for every row.. select top 10 ProductId, @count as TotalCount from ..... 

Angenommen, Sie verwenden bereits eine ORDER BY-Klausel (um richtig zu definieren, welche "TOP 10" Ergebnisse sind), dann könnt ihr auch einen Anruf von ROW_NUMBER mit der entgegengesetzten Sortierreihenfolge hinzufügen und den höchsten Wert zurückgeben.

ZB folgendes:

 select top 10 *,ROW_NUMBER() OVER (order by id desc) from sysobjects order by ID 

Hat eine letzte Spalte mit Werten 2001, 2000, 1999, etc., absteigend. Und die folgende:

 select COUNT(*) from sysobjects 

Bestätigt, dass es 2001 Zeilen in Sysobjekten gibt.

Ich nehme an, du könntest es mit einem Gewerkschaftsauswahl hacken

 select top 10 ... from ... where ... union select count(*) from ... where ... 

Für Sie, um weg mit dieser Art von Hack müssen Sie fake Spalten, um die Zählung Abfrage hinzufügen, so dass es die gleiche Menge an Spalten wie die Hauptabfrage zurückgibt. Beispielsweise:

 select top 10 id, first_name from people union select count(*), '' as first_name from people 

Ich empfehle diese Lösung nicht. Mit zwei separaten Abfragen ist, wie es gemacht werden sollte

Grundsätzlich heißt es nicht :

Wenn (!) Der Abfrageplaner von TOP 10 Gebrauch machen kann, um nur 10 Zeilen zurückzugeben, dann bekommt RDBMS nicht einmal die genaue Anzahl von Zeilen kennen, die die vollen Kriterien erfüllen, sondern nur die TOP 10.

Deshalb, wenn Sie herausfinden wollen, zählen alle Zeilen, die die Kriterien erfüllen, die Sie nicht laufen, das zweite Mal, aber das erste Mal.

Having said, dass richtige Indizes können beide Abfragen ziemlich schnell ausführen.

Bearbeiten
MySQL hat SQL_CALC_FOUND_ROWS, die die Anzahl der Zeilen zurückgibt, die die Abfrage zurückgibt, wenn kein LIMIT angewendet wurde – googeln für ein Äquivalent in MS SQL-Punkten auf analytische SQL- und CTE-Variante, siehe dieses Forum (auch wenn es nicht sicher ist, dass man sich entweder als es ausführen würde nur einmal, aber fühlen Sie sich frei zu überprüfen – und lassen Sie uns wissen).