¿Cómo imitar SELECT ... LIMIT, OFFSET en OpenEdge SQL?
Es algo común en la mayoría de las implementaciones de SQL poder seleccionar un subconjunto de "ventana deslizante" de todas las filas devueltas en una consulta. Un caso de uso común para esto es la paginación. Por ejemplo, digamos que tengo una página de búsqueda con 10 resultados en cada página. Para implementaciones que soportenLIMIT
yOFFSET
palabras clave, la consulta utilizada para devolver resultados para cada página sería la siguiente: la página uno usaríaSELECT ... LIMIT 10 OFFSET 0
, la página 2 usaríaSELECT ... LIMIT 10 OFFSET 10
, la página 3 usaríaSELECT ... LIMIT 10 OFFSET 20
, etc. (tenga en cuenta que laOFFSET
entra en vigor antes deLIMIT
).
De todos modos, estoy tratando de imitar esta funcionalidad en el motor SQL de OpenEdge. Ya he descubierto queSELECT TOP
es básicamente equivalente aLIMIT
Sin embargo, no puedo encontrar nada similar aOFFSET
(No creo que haya unaexacto equivalente). SQL Server y Oracle también carecen de unaOFFSET
, pero tienen una pseudocolumna llamadaROWCOUNT
yROWNUM
, respectivamente, que se pueden utilizar para imitar el comportamiento mediante selecciones anidadas (veraquí yaquí).
En el10.2B referencia de SQL doc, p49 hay una subseccion tituladaCláusula TOP eso dice en la parte inferior
SELECT TOP
Es el equivalente funcional del oráculo.ROWNUM
funcionalidad Tenga en cuenta queSELECT TOP
se define simplemente en términos de un límite en el tamaño del conjunto de resultados, y el optimizador determina cómo usar este límite para el mejor acceso a los datos. Así,SELECT TOP
no tiene todas las "reglas de procedimiento" utilizadas para definir el significado de OracleROWNUM
frase.
Sin embargo, esto parece ser inexacto ya que de acuerdo conTOP
La sintaxis no puede usarse como predicado comoROWNUM
puedo (por ejemplo, no puedo decirSELECT * FROM Customer WHERE TOP > 5 AND TOP < 10
). Asi queTOP
esno funcionalmente equivalente aROWNUM
.
¿Hay alguna manera de imitarOFFSET
, o estoy fuera de suerte?