Frage

Wie führt man Paging in Pervasive SQL (Version 9.1) durch?Ich muss etwas Ähnliches tun wie:

//MySQL
SELECT foo FROM table LIMIT 10, 10

Aber ich kann keine Möglichkeit finden, den Offset zu definieren.

War es hilfreich?

Lösung 4

ich am Ende tun die Paging-in-Code auf. Ich überspringe nur die ersten Einträge in der Schleife.

Ich dachte, mich für das Erledigen des Funkruf einen einfachen Weg gemacht, aber es scheint, dass Pervasive SQL nicht um Klauseln in Unterabfragen nicht zulassen. Dies sollte aber auf anderen DBs arbeiten (Getestet habe ich es auf Feuervogel)

select *
from (select top [rows] * from
(select top [rows * pagenumber] * from mytable order by id)
order by id desc)
order by id

Andere Tipps

Getestet Abfrage in PSQL:

select top n * 
from tablename 
where id not in(
select top k id
from tablename 
) 

für alle n = Anzahl Datensätze müssen u zu einem Zeitpunkt, zu holen. und k = ein Vielfaches von n (zum Beispiel n = 5;. k = 0,5,10,15, ....)

Für unser Paging war es erforderlich, dass wir die aktuelle Seitenzahl und Seitengröße (zusammen mit einigen zusätzlichen Filterparametern) als Variablen übergeben können.Da ein „select top @page_size“ in MS SQL nicht funktioniert, haben wir uns überlegt, eine temporäre oder variable Tabelle zu erstellen, um den Primärschlüsseln jeder Zeile eine Identität zuzuweisen, die später nach der gewünschten Seitenzahl und -größe gefiltert werden kann.

** Beachten Sie, dass Sie bei einem GUID-Primärschlüssel oder einem zusammengesetzten Schlüssel lediglich die Objekt-ID in der temporären Tabelle in einen eindeutigen Bezeichner ändern oder die zusätzlichen Schlüsselspalten zur Tabelle hinzufügen müssen.

Der Nachteil dabei ist, dass immer noch alle Ergebnisse in die temporäre Tabelle eingefügt werden müssen, aber zumindest sind es nur die Schlüssel.Dies funktioniert in MS SQL, sollte aber mit minimalen Anpassungen für jede Datenbank funktionieren.

Declare @page_Number int, @page_size int - Fügen Sie hier zusätzliche Suchparameter hinzu

--erstellen Sie die temporäre Tabelle mit der Identitätsspalte und der ID
--des Datensatzes, den Sie auswählen.Dies ist eine Erinnerung
--table, wenn also die Anzahl der einzufügenden Zeilen größer ist
--als 10.000, dann sollten Sie eine temporäre Tabelle in tempdb verwenden
--stattdessen.Verwenden Sie dazu
--CREATE TABLE #temp_table (row_num int IDENTITY(1,1), objectid int)
--und ändern Sie alle Verweise auf @temp_table in #temp_table
DECLARE @temp_table TABLE (row_num int IDENTITY(1,1), objectid int)

--insert in die temporäre Tabelle mit den IDs der Datensätze
--wir wollen zurückkehren.Es ist wichtig, die Reihenfolge sicherzustellen
--spiegelt die Reihenfolge der zurückzugebenden Datensätze wider, sodass die row_num
--values ​​werden in der richtigen Reihenfolge festgelegt und wir wählen die aus
--korrekte Datensätze basierend auf der Seite
IN @temp_table EINSETZEN (Objekt-ID)

/* Beispiel:Wählen Sie, dass Datensätze in die temporäre Tabelle einfügt
Person auswählen
VON Person MIT (NEIN)
innerer Join-Grad MIT (NOLOCK) auf degree.personid = person.personid
WO person.lastname = @last_name
BESTELLEN NACH Person.Nachname asc, person.firsname asc
*/

--get die Gesamtzahl der Zeilen, die wir gefunden haben
DEKLARIEREN @total_rows Int
SET @total_rows = @@ROWCOUNT
--Berechnen Sie die Gesamtzahl der Seiten basierend auf der Anzahl
--rows, die übereinstimmten, und die Seitengröße, die als Parameter übergeben wurde
ERKLÄREN @total_pages int
--addieren Sie @page_size - 1 zur Gesamtzahl der Zeilen
--Berechnen Sie die Gesamtzahl der Seiten.Das liegt daran, dass SQL
--rundet bei der Division ganzer Zahlen immer ab
SET @total_pages = (@total_rows + @page_size - 1) / @page_size

--return die Ergebnismenge, an der wir interessiert sind, indem wir beitreten
--zurück zur @temp_table und Filterung nach row_num
/* Beispiel:Auswahl der zurückzugebenden Daten.Wenn die Einfügen wurde durchgeführt
richtig, dann Sie sollten immer mit am Tisch sitzen , die enthält
Die Zeilen, die zurückgegeben werden sollen in die objectId-Spalte auf der Seite @temp_table

Person AUSWÄHLEN.*
VON Person MIT (NEIN) INNERE VERBINDUNG @temp_table Tt
EIN person.personid = tt.objectid
*/
--return nur die Zeilen auf der Seite, die uns interessieren
--und nach der row_num-Spalte der @temp_table sortieren, um sicherzugehen
--wir wählen die richtigen Datensätze aus
WO tt.row_num < (@page_size * @page_number) + 1
UND tt.row_num > (@page_size * @page_number) - @page_size
BESTELLUNG VON tt.row_num

Ich stehe dieses Problem in MSSql zu ... No Limit oder rownumber Funktionen. Was ich tue, ist den Schlüssel für mein letztes Abfrageergebnis einzufügen (oder manchmal auch die gesamte Liste der Felder) in eine temporären Tabelle mit einer Identitätsspalte ... dann lösche ich aus dem temporären Tabelle alles außerhalb des Bereichs ich will ... dann verwenden Join gegen die Schlüssel und die Original-Tabelle, um die Elemente zu bringen ich will. Dies funktioniert, wenn Sie einen schönen eindeutigen Schlüssel haben -. Wenn Sie dies nicht tun, na ja ... das ist ein Design-Problem in sich selbst

Alternative mit etwas besseren Leistung ist das Löschen Schritt zu überspringen und nur die Zeilennummern in Ihrem letzten beitreten verwenden. Eine weitere Leistungssteigerung ist die TOP-Operator zu verwenden, so dass zumindest Sie nicht das Zeug über das Ende greifen müssen, was Sie wollen.

So ... in Pseudo-Code ... Artikel 80-89 greifen ...

create table #keys (rownum int identity(1,1), key varchar(10))

insert #keys (key)
select TOP 89 key from myTable ORDER BY whatever

delete #keys where rownumber < 80

select <columns> from #keys join myTable on #keys.key = myTable.key
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top