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 0würde Seite 2 verwendenSELECT ... LIMIT 10 OFFSET 10würde Seite 3 verwendenSELECT ... LIMIT 10 OFFSET 20usw. (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 mitLIMITAllerdings 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 undROWNUMDies 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 imitierenOFFSEToder habe ich kein glück

Antworten auf die Frage(1)

Ihre Antwort auf die Frage