Incluso si puede añadir a esta consulta ROWNUM todavía no puede obtener los resultados que desea. El problema es que la cláusula WHERE se aplica antes que ORDER BY; por lo tanto, al limitarse a las primeras 10 filas devueltas, obtendrás esas diez filas y luego se ordenarán. He aquí un ejemplo:
CREATE TABLE order_test(seq_num NUMBER);
INSERT INTO order_test(seq_num) VALUES(20);
INSERT INTO order_test(seq_num) VALUES(19);
INSERT INTO order_test(seq_num) VALUES(18);
INSERT INTO order_test(seq_num) VALUES(17);
INSERT INTO order_test(seq_num) VALUES(16);
INSERT INTO order_test(seq_num) VALUES(15);
INSERT INTO order_test(seq_num) VALUES(14);
INSERT INTO order_test(seq_num) VALUES(13);
INSERT INTO order_test(seq_num) VALUES(12);
INSERT INTO order_test(seq_num) VALUES(11);
INSERT INTO order_test(seq_num) VALUES(10);
INSERT INTO order_test(seq_num) VALUES(09);
INSERT INTO order_test(seq_num) VALUES(08);
INSERT INTO order_test(seq_num) VALUES(07);
INSERT INTO order_test(seq_num) VALUES(06);
INSERT INTO order_test(seq_num) VALUES(05);
INSERT INTO order_test(seq_num) VALUES(04);
INSERT INTO order_test(seq_num) VALUES(03);
INSERT INTO order_test(seq_num) VALUES(02);
INSERT INTO order_test(seq_num) VALUES(01);
SELECT * FROM order_test WHERE ROWNUM < 10 ORDER BY seq_num;
la consulta devuelve
12
13
14
15
16
17
18
19
20
en mi sistema. Sospecho que lo que quiere es el equivalente de
SELECT *
FROM (SELECT * FROM ORDER_TEST ORDER BY SEQ_NUM)
WHERE ROWNUM < 10
que devuelve 1 a 9.
No sé si es o cómo se puede anidar en consultas Glorp. (FWIW - Conozco y amo Smalltalk, pero detesto los marcos de persistencia por razones como esta). YMMV, obviamente.
(Por cierto, pensando en esto por un minuto, es posible que pueda modificar el método #limit: Glorp.SimpleQuery para insertar una comparación con ROWNUM en la cláusula WHERE, pero como dije anteriormente, los resultados aún pueden no ser lo que se pretende. Una implementación se deja como un ejercicio para el lector interesado :-).
Comparte y disfruta.
La forma habitual de limitar el número de filas en Oracle es seleccionar * de (seleccionar ... ordenar por ...) donde rownum <10. ¿Puede modificar la consulta que genera Glorp? –
Sí, debería haber mencionado que sé cómo hacerlo en Oracle. Simplemente no sé cómo hacerlo en Glorp. – Cantillon
¿Glorp usa cursores en el fondo cuando trabaja con Oracle, o realmente extrae todos los resultados en la memoria? –