Como imitar SELECT ... LIMIT, OFFSET no OpenEdge SQL?
É comum na maioria das implementações SQL poder selecionar um subconjunto de "janela deslizante" de todas as linhas retornadas em uma consulta. Um caso de uso comum para isso é paginação. Por exemplo, digamos que eu tenha uma página de pesquisa com 10 resultados em cada página. Para implementações que suportamLIMIT
eOFFSET
palavras-chave, a consulta usada para retornar resultados para cada página seria a seguinte: a página um usariaSELECT ... LIMIT 10 OFFSET 0
, a página 2 usariaSELECT ... LIMIT 10 OFFSET 10
, a página 3 usariaSELECT ... LIMIT 10 OFFSET 20
, etc. (note que oOFFSET
entra em vigor antes doLIMIT
).
De qualquer forma, estou tentando imitar essa funcionalidade no mecanismo SQL do OpenEdge. Eu já descobri queSELECT TOP
é basicamente equivalente aLIMIT
, no entanto não consigo encontrar nada parecido comOFFSET
(Eu não acho que há umaexato equivalente). SQL Server e Oracle também carecem deOFFSET
, mas eles têm uma pseudocoluna chamadaROWCOUNT
eROWNUM
, respectivamente, que podem ser usados para imitar o comportamento usando seleções aninhadasAqui eAqui).
NoReferência SQL 10.2B doc, p49 existe uma subseção intituladaCláusula TOP que diz na parte inferior
SELECT TOP
é o equivalente funcional do OracleROWNUM
funcionalidade. Observe queSELECT TOP
é definido simplesmente em termos de um limite no tamanho do conjunto de resultados e o otimizador determina como usar esse limite para melhor acesso aos dados. Portanto,SELECT TOP
não tem todas as "regras processuais" usadas para definir o significado do OracleROWNUM
frase.
No entanto, isso parece ser impreciso como de acordo comTOP
a sintaxe não pode ser usada como um predicado comoROWNUM
pode (por exemplo, eu não posso dizerSELECT * FROM Customer WHERE TOP > 5 AND TOP < 10
). assimTOP
énão funcionalmente equivalente aROWNUM
.
Existe alguma maneira de imitarOFFSET
ou estou sem sorte?