Query SQL Con Row_Number, ordina per e dove clausola
-
08-07-2019 - |
Domanda
Ho la seguente query SQL:
select
ID, COLUMN1, COLUMN2
from
(select ID, COLUMN1, COLUMN2, row_number() over (order by 2 DESC) NO from A_TABLE)
where
NO between 0 and 100
Quello che sto cercando di fare è selezionare i primi 100 record della query
select ID, COLUMN1, COLUMN2 from ATABLE order by 2 DESC
Ed ecco i problemi:
-
Apparentemente, la clausola
ordina per
non funziona. Ho notato che devo aggiungere un altro ordineper 2 DESC
, subito dopo(...) da ATABLE
, affinché la mia query funzioni. C'è qualcosa che faccio di sbagliato? O è un comportamento previsto? -
Come posso aggiungere una clausola
where
? Diciamo che devo selezionare solo i primi 100 record della tabelladove COLUMN1 come '% value%'
. Ho provato ad aggiungere la clausola where dopo(...) da ATABLE
ma ha prodotto un errore ...
Aiuto? Grazie.
PS: sto usando Oracle 10g R2.
Soluzione
rownum è una pseudo colonna che conta le righe nel set di risultati dopo la clausola where è stata applicata.
È questo ciò che stai cercando di ottenere?
SELECT *
FROM (
SELECT id, column1, column2
FROM atable ORDER BY 2 DESC
)
WHERE ROWNUM < 100;
Poiché è una pseudo colonna che è rigorosamente un contatore di righe risultante dalla clausola where, non ti consentirà di eseguire l'impaginazione (ovvero tra 200 e 300).
Questo è probabilmente quello che stai cercando:
SELECT *
FROM
(SELECT a.*, rownum rnum FROM
(SELECT id, column1, column2 FROM atable ORDER BY 2 DESC) a WHERE rownum <= 300)
WHERE rnum >= 200;
Altri suggerimenti
Dai un'occhiata a queste FAQ Oracle . In particolare questa parte:
SELECT *
FROM (SELECT a.*, rownum RN
FROM (SELECT *
FROM t1 ORDER BY key_column) a
WHERE rownum <=7)
WHERE rn >=5
Per rispondere alla tua prima domanda: non utilizzare un numero di colonna nella clausola order by, ma utilizzare il nome della colonna. Non capisco perfettamente la tua seconda domanda, perché l'aggiunta di un WHERE nel tuo SELECT più interno dovrebbe fare il trucco:
select ID
, COLUMN1
, COLUMN2
from (select ID
, COLUMN1
, COLUMN2
, row_number() over (order by COLUMN1 DESC) NO
from A_TABLE
where COLUMNX LIKE '%SOME VALUE%'
)
where NO between 0 and 100
P.S. (to willcodejavaforfood) Penso che usare row_number () sia migliore quando si desidera ordinare le righe. Salva una visione interiore (grande vittoria per leggibilità).
Perché non usi
Select top 100 ID, Column1, Column2
From A_Table
where Column1 like '%value%'
order by Column2 desc
Qui otterrai il record limitato dal database di Oracle senza l'uso di rownum
select * from
( select ,column1,column2,row_number() over (order by columnName) as rnum
from table_name)
where rnum between 5 and 10;