Anche se si può aggiungere ROWNUM a questa domanda si può ancora non ottenere i risultati desiderati. Il problema è che la clausola WHERE viene applicata prima di ORDER BY, quindi, limitando le prime 10 righe restituite, otterrai quelle dieci righe e quindi verranno ordinate. Ecco un esempio:
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 query restituisce
12
13
14
15
16
17
18
19
20
sul mio sistema. Ho il sospetto che ciò che si vuole è l'equivalente di
SELECT *
FROM (SELECT * FROM ORDER_TEST ORDER BY SEQ_NUM)
WHERE ROWNUM < 10
che ritorna da 1 a 9.
Non so se e come è possibile query nidificare in Glorp. (FWIW - Conosco e amo Smalltalk, ma detesto le strutture di persistenza per ragioni come questa). YMMV, ovviamente.
(BTW - pensateci per un minuto, potreste essere in grado di modificare il metodo #limit: su Glorp.SimpleQuery per iniettare un confronto con ROWNUM nella clausola WHERE - ma come ho detto sopra, i risultati potrebbero ancora non è ciò che è inteso: un'implementazione è lasciata come esercizio al lettore interessato :-).
Condividi e divertiti.
fonte
2012-09-06 11:56:21
Il metodo normale per limitare il numero di righe in Oracle è selezionare * da (selezionare ... ordina per ...) dove rownum <10. È possibile modificare la query generata da Glorp? –
Sì, avrei dovuto dire che so come farlo in Oracle. Solo che non so come farlo in Glorp. – Cantillon
Glorp utilizza i cursori in background quando si lavora con Oracle o in realtà recupera tutti i risultati in memoria? –