2009-05-12 11 views
10

Perché il seguente ritorno interrogazione 'zero' record:Oracle/SQL: Perché query "SELECT * FROM record in cui rownum> = 5 e rownum <= 10" - restituiscono zero righe

 
SELECT * FROM records WHERE rownum >= 5 AND rownum <= 10 

    OR 

SELECT * FROM records WHERE rownum >= 5 

considerando che la dopo il ritorno interrogazione adeguate registrazioni:

 
SELECT * FROM records WHERE rownum <= 15 

saluti,
- Ashish

+0

È sempre possibile utilizzare un segno meno per sottrarre i risultati di una query <= rown dall'intera query. –

risposta

32

In Oracle, valori rownum vengono assegnati dopo la fase di filtraggio della query - non sono righe della tabella, sono righe del set di risultati della query.

Quindi la prima riga che ritorna sempre fornita rownum 1, la seconda fila che ritorna rownum 2, etc.

Il valore rownum viene incrementato solo dopo che è stato assegnato, in modo che qualsiasi domanda come

select * from t where ROWNUM > 1 

mai restituisce alcun risultato. Questa query dice "Non voglio vedere la prima riga che mi viene restituita, solo quelle successive", che è un paradosso per cui non viene restituito nulla.

Vedere Ask Tom:On ROWNUM and Limiting Results per ulteriori dettagli.

+0

È possibile accedere al rownum di una sottoquery all'interno di una query più ampia? Sospetto che potrebbe essere la domanda originale. –

+0

Ah, vedo che Tom spiega che nell'articolo che hai linkato, nella sezione "Paginazione con ROWNUM". Ottimo collegamento! –

+0

Hmm !! e ho pensato che avrei potuto usare "rownum" per filtrare qualsiasi sottoinsieme di record. Questa è stata una vera risposta dettagliata e informativa - grazie "codeulike" per il tuo aiuto. – Vini

1

ROWNUM è una pseudocolonna e il suo valore non sarà disponibile al momento dell'esecuzione della query. Quindi non puoi filtrare i risultati in base a questa colonna. Detto questo, ci sono dei problemi per mitigarlo. Si prega di vedere sotto (non è raccomandato l'uso se il risultato è molto grande).

Select a.* From 
(
    Select COL1, COL2, ROWNUM RowNumber From MyTable 
) a 
Where 
    RowNumber = 5; 
1

alternativa è quella di utilizzare MINUS

SELECT * FROM records 
WHERE ROWNUM <= 10 
minus SELECT * FROM records 
WHERE ROWNUM <= 5 

questo sarà filtrare i valori non univoci quindi è meglio essere selezionando id.

Spero che questo ti salvi un po 'di tempo.

Problemi correlati