Wie kann man SELECT… LIMIT, OFFSET in OpenEdge SQL nachahmen?
In den meisten SQL-Implementierungen ist es üblich, aus allen in einer Abfrage zurückgegebenen Zeilen eine Teilmenge "Schiebefenster" auswählen zu können. Ein häufiger Anwendungsfall hierfür ist die Paginierung. Angenommen, ich habe eine Suchseite mit 10 Ergebnissen auf jeder Seite. Für Implementierungen, die dies unterstützenLIMIT
undOFFSET
Schlüsselwörter lautet die Abfrage, die zum Zurückgeben der Ergebnisse für jede Seite verwendet wird, wie folgt: Seite, die verwendet wirdSELECT ... LIMIT 10 OFFSET 0
würde Seite 2 verwendenSELECT ... LIMIT 10 OFFSET 10
würde Seite 3 verwendenSELECT ... LIMIT 10 OFFSET 20
usw. (beachten Sie, dass dieOFFSET
tritt vor dem in KraftLIMIT
).
Auf jeden Fall versuche ich, diese Funktionalität in der SQL-Engine von OpenEdge nachzuahmen. Das habe ich schon herausgefundenSELECT TOP
ist im Grunde gleichbedeutend mitLIMIT
Allerdings kann ich nichts ähnliches findenOFFSET
(Ich glaube nicht, dass es eine gibtgenau Äquivalent). SQL Server und Oracle fehlt auch einOFFSET
, aber sie haben eine Pseudospalte genanntROWCOUNT
undROWNUM
Dies kann verwendet werden, um das Verhalten mit verschachtelten Auswahlen nachzuahmen (sieheHier undHier).
In dem10.2B SQL-Referenz doc, p49 gibt es einen unterabschnitt mit dem titelTOP-Klausel das steht unten
SELECT TOP
ist das funktionale Äquivalent des OracleROWNUM
Funktionalität. Beachten Sie, dassSELECT TOP
wird einfach als Limit für die Größe der Ergebnismenge definiert, und das Optimierungsprogramm bestimmt, wie dieses Limit für den besten Datenzugriff verwendet wird. Somit,SELECT TOP
verfügt nicht über alle "Verfahrensregeln", die zur Definition der Bedeutung von Oracle verwendet werdenROWNUM
Phrase.
Dies scheint jedoch ungenau zu sein, soTOP
's Syntax kann nicht als Prädikat verwendet werdenROWNUM
kann (z. B. kann ich nicht sagenSELECT * FROM Customer WHERE TOP > 5 AND TOP < 10
). SoTOP
istnicht funktional äquivalent zuROWNUM
.
Gibt es eine Möglichkeit zu imitierenOFFSET
oder habe ich kein glück