Frage

Aufgabe: Umsetzung Paging von Datenbank-Datensätzen für verschiedene RDBMS. Methode sollte für Mainstream-Motoren arbeiten -. MSSQL2000 +, Oracle, MySQL, etc.

Bitte schreiben Sie keine RDBMS spezifische Lösungen, ich weiß, wie dies der modernen Datenbank-Engines für die meisten zu implementieren. Ich interessiere mich für die universelle Lösung. Nur temporäre Tabellen basierte Lösungen kommen meiner Meinung nach im Moment.

EDIT:
Ich suche nach SQL-Lösung, nicht 3rd-Party-Bibliothek.

War es hilfreich?

Lösung

Es wäre eine universelle Lösung gewesen, wenn SQL Spezifikationen Paging als Standard enthalten waren. Die Voraussetzung für jede RDBMS Sprache werden, um eine RDBMS Sprache genannt ist nicht so gut Paging-Unterstützung.

Viele Datenbankprodukte SQL mit proprietären Erweiterungen der Standardsprache unterstützen. Einige von ihnen unterstützen Paging wie MySQL mit der limit-Klausel, Rowid mit Oracle; jeweils unterschiedlich gehandhabt. Andere DBMS benötigen ein Feld namens Rowid oder so etwas hinzuzufügen.

Ich denke nicht, Sie eine universelle Lösung haben kann (mir jemand zu beweisen, ist frei falsch hier, offen Debatte), wenn es in das Datenbanksystem aufgebaut ist selbst oder es sei denn, ein Unternehmen sagen, ist ABC, die verwendet Oracle, MySQL, SQL Server und sie entscheiden, haben alle verschiedenen Datenbanksysteme bieten ihre eigene Implementierung von Paging durch ihre Datenbank-Entwicklern eine universelle Schnittstelle für den Code bereitstellt, die es verwendet.

Andere Tipps

Die natürlichste und effiziente Art und Weise Paging zu tun ist, mit dem LIMIT / OFFSET (TOP in Sybase Welt) konstruieren. Ein DBindependent Weg würde wissen, welchen Motor läuft es auf und das richtige SQL-Konstrukt gilt.

Zumindest ist das die Art und Weise habe ich es in DB unabhängigen Bibliotheken Code getan gesehen. Sie können die Paging-Logik abstrahieren, wenn Sie die Daten aus dem Motor mit der spezifischen Abfrage erhalten.

Wenn Sie wirklich suchen nach einer einzigen, einer SQL-Satz-Lösung, könnten zeigen Sie, was Sie im Kopf haben? Wie die SQL für die temporäre Tabelle Lösung. Das wäre wahrscheinlich Ihnen relevantere Vorschläge.

EDIT:

wollte ich sehen, was dachten Sie, weil ich keine Möglichkeit, es mit temporären Tabellen zu tun, sehen und nicht motorspezifische Konstrukt verwenden. Sie verwendet, um spezifische Konstrukte im Beispiel. Ich sehe immer noch keinen Weg Paging in der Datenbank zu implementieren mit nur (implementiert) Standard-SQL. Man könnte die ganze Tabelle in Standard-SQL und Seite in der Anwendung bringen, aber das ist offensichtlich dumm.

So ist die Frage nun mehr wäre wie „Gibt es eine Möglichkeit Paging zu implementieren, ohne Verwendung von LIMIT / OFFSET oder gleichwertig?“ und ich denke, dass die Antwort „sanely, nein.“ Sie könnten versuchen, mit Cursor, aber Sie werden auch dort Beute Datenbank spezifische Sätze / Verhalten fallen.

Ein wacko (lesen dumme) Idee, die mir gerade aufgetreten wäre, eine Seite Spalte der Tabelle hinzuzufügen, sagen Tabelle Test (id int, Name varchar, Telefon varchar- Seite int) erstellen und dann können Sie erhalten Seite 1 mit select * from table where page = 1. das bedeutet aber, mit Code hinzufügen diese Spalte zu erhalten, die wiederum nur durch entweder bringen die gesamte Datenbank oder mit Datenbank-spezifische Konstrukte getan werden könnte. Dass neben eine andere Spalte für jede mögliche Bestellung und viele andere Mängel zu müssen.

Ich kann Beweis nicht liefern, aber ich glaube wirklich, Sie können es einfach nicht vernünftig.

Gehen Sie wie gewohnt:
Beginnen Sie, indem sie die Umsetzung nach dem Standard. Und dann die Ecke Fälle behandeln, das heißt die DBMSes, die den Standard nicht implementieren. Wie die Ecke Fälle zu behandeln, hängt von Ihrer Entwicklungsumgebung.

Sie suchen nach einer „universellen“ -Ansatz. Die allgemeinste Art und Weise zu Paginieren, ist die Verwendung von einem Cursor, Cursor-basierte Paginierung paßt nicht sehr gut mit einer nicht-Stateful-Umgebung wie eine Web-Anwendung.

Ich habe über den Standard geschrieben und die Implementierungen (einschließlich Cursor) hier: http://troels.arvin.dk/db/rdbms/#select- limit-Offset

Subsonic kann dies für Sie tun, wenn Sie, wenn Sie Open Source tolerieren kann ... http://subsonicproject.com/querying/webcast-using-paging/

Anders als das ich kenne NHib tut auch

JPA können Sie es mit dem Query-Klasse zu tun:

Query q = ...;
q.setFirstResult (0);
q.setMaxResults (10);

gibt Ihnen die ersten 10 Ergebnisse in der Ergebnismenge.

Wenn Sie ein DBMS unabhängig rohen SQL-Lösung wollen, ich fürchte, Sie kein Glück. Alle Anbieter macht es anders.

@Vinko Vrsalovic,

, wie ich in Frage schrieb ich weiß, wie es in den meisten DBs zu tun. I was universelle Lösung zu finden oder einen Beweis erhalten, dass es nicht existiert.

Hier ist eine dumme Lösung, die auf temporäre Tabelle. Es ist natürlich schlecht, so dass keine Notwendigkeit, ihn zu kommentieren.

N - upper bound
M - lower bound

create #temp (Id int identity, originalId int)

insert into #temp(originalId)
select top N KeyColumn from MyTable
where ...

select MyTable.* from MyTable
join #temp t on t.originalId = MyTable.KeyColumn
where Id between M and M
order by Id asc

drop #temp
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top