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:

  1. Apparentemente, la clausola ordina per non funziona. Ho notato che devo aggiungere un altro ordine per 2 DESC , subito dopo (...) da ATABLE , affinché la mia query funzioni. C'è qualcosa che faccio di sbagliato? O è un comportamento previsto?

  2. Come posso aggiungere una clausola where ? Diciamo che devo selezionare solo i primi 100 record della tabella dove 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.

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top