2012-06-11 5 views
6

I iBatis und SQLServer verwende,SQL-Abfrage für asp.net Raster Paginierung

Was ist der beste Weg für den Einsatz von Offset und Begrenzung für pagging Abfragen?

Vielleicht füge ich die Spalte ROW_NUMBER() OVER (ORDER BY Id) AS RowNum hinzu, aber dies wird nur den Datenzugriff für einfache Abfragen verhindern. Es gibt einige Fälle, in denen ich die Vereinigung von Selektionen verwende. Wie optimiert man diese Abfragen?

Antwort

1

Ich weiß nichts über ibatis, aber ich denke, Sie könnten dies in SQL tun.

Wenn ich Sie richtig verstehe, möchten Sie paginate die Ergebnisse einer Auswahlanweisung oder Vereinigung einiger select-Anweisungen erhalten.

Ich würde es folgendermaßen tun. Dies könnte zum Beispiel eine gespeicherte Prozedur sein, und es sollte wahrscheinlich eine gewisse Plausibilitätsprüfung geben. Überprüfen Sie, ob die Werte von Offset und Limit größer als 0 sind. Wenn Sie etwas so tun, ersetzen Sie * durch Ihre Spalte Namen auch! Hier

ist ein Beispiel mit einer Gewerkschaft:

DECLARE @offset INT; 
DECLARE @limit INT; 

WITH cte 
    AS (SELECT t.*, 
       Row_number() OVER (ORDER BY Id) AS RowNum 
     FROM (SELECT * 
       FROM Table1 
       UNION 
       SELECT * 
       FROM Table2) t) 
SELECT * 
FROM cte 
WHERE RowNum BETWEEN @offset AND @offset + @limit 

Wesentliches, was ich getan habe, abgeleitet wird eine neue Tabelle aus der Vereinigung von zwei Abfragen, wie Sie in Ihrem Fall passieren sagen können. Ich füge dann eine Spalte mit der Zeilennummer zu dem Ergebnis davon in einem CTE hinzu, dann nur die Zeilen auswählend, die in @Offset und @limit + @offset spezifiziert wurden, um nur die Reihen zurückzubekommen, die du verlangst.

z. Einstellen @offset = 50 und @limit = 50, dann würden Sie Ergebnisse 50-100 zurück (wie durch die Kriterien in der Row_number über Klausel angegeben bestellt.

(Ich hoffe, das die Art der Sache war die Sie gesucht haben!)

Bearbeiten: Dies funktioniert nur in SQL Server 2005 - Sie haben nicht erwähnt, welche Version Sie verwenden!

+0

Wie kann ich die Gesamtzahl der Zeilen erhalten? – Victor

+0

Wählen Sie aus dem CTE entweder zählen (*) 'oder' Max (RowNum) ... ' – Bridge

Verwandte Themen