2010-10-18 9 views

risposta

71

PostgreSQL> 8,4

SELECT 
    row_number() OVER (ORDER BY col1) AS i, 
    e.col1, 
    e.col2, 
    ... 
FROM ... 
+12

stare attenti. Questo è simile al reap di oracolo, ma è leggermente diverso. Il rownum di Oracle viene assegnato al momento della lettura della riga dal disco, mentre questo numero_riga() viene assegnato a seconda di cosa c'è nel tuo OVER – Royce

+0

E per quanto riguarda le differenze di velocità? – Nashev

2

Postgresql non ha un equivalente di ROWNUM di Oracle. In molti casi è possibile ottenere lo stesso risultato utilizzando LIMIT e OFFSET nella query.

+0

-1 che sembra essere sbagliato, vedere la risposta accettata ... –

+3

+1 ROWNUM e ROW_NUMBER() OVER() non sono esattamente la stessa –

9

Se si desidera solo un certo numero di tornare provare questo.

create temp sequence temp_seq; 
SELECT inline_v1.ROWNUM,inline_v1.c1 
FROM 
(
select nextval('temp_seq') as ROWNUM, c1 
from sometable 
)inline_v1; 

È possibile aggiungere un ordine dal al SQL inline_v1 così il vostro ROWNUM ha qualche significato sequenziale ai dati.

select nextval('temp_seq') as ROWNUM, c1 
from sometable 
ORDER BY c1 desc; 

Potrebbe non essere il più veloce, ma è un'opzione se davvero ne avete bisogno.

18

ho appena testato in Postgres 9.1 una soluzione che è vicino a Oracle ROWNUM:

select row_number() over() as id, t.* 
from information_schema.tables t; 
+0

Ho provato questo in 8.4 e funziona anche lì. – Mac

+3

Si noti che questo non rispetterà un 'ORDER BY' nella query esterna. –

7

PostgreSQL hanno limite.

codice di Oracle:

select * 
from 
    tbl 
where rownum <= 1000; 

stesso nel codice di PostgreSQL:

select * 
from 
    tbl 
limit 1000 
0

utilizzare il clausule limite, con l'offset per scegliere il numero di riga -1 quindi se u desidera ottenere la riga numero 8 in modo da utilizzare:

limite 1 compensata 7

0

Se si dispone di una chiave univoca, è possibile utilizzare COUNT(*) OVER (ORDER BY unique_key) as ROWNUM

SELECT t.*, count(*) OVER (ORDER BY k) ROWNUM 
FROM yourtable t; 

| k |  n | rownum | 
|---|-------|--------| 
| a | TEST1 |  1 | 
| b | TEST2 |  2 | 
| c | TEST2 |  3 | 
| d | TEST4 |  4 | 

DEMO