2010-10-18 7 views

Antwort

71

Postgresql> 8,4

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

vorsichtig. Das ist ähnlich dem Orakel rownum, aber es ist etwas anders. Oracle's rownum wird beim Lesen der Zeile von der Festplatte zugewiesen, während diese row_number() abhängig davon zugewiesen wird, was in Ihrem OVER – Royce

+0

ist. Was ist mit Geschwindigkeitsunterschieden? – Nashev

2

Postgresql hat kein Äquivalent von Oracle ROWNUM. In vielen Fällen können Sie dasselbe Ergebnis erzielen, wenn Sie in Ihrer Abfrage LIMIT und OFFSET verwenden.

+0

-1 Das Ordnung zu sein scheint, finden Sie in der akzeptierte Antwort ... –

+3

+1 ROWNUM und ROW_NUMBER() OVER() sind nicht genau das gleiche –

9

Wenn Sie nur eine Nummer wollen, dass diese wieder kommen versuchen.

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

Sie können einen Auftrag von zum inline_v1 SQL hinzufügen, damit Ihre ROWNUM eine sequentielle Bedeutung, um Ihre Daten haben.

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

Vielleicht nicht die schnellste, aber es ist eine Option, wenn Sie sie wirklich brauchen.

18

I in Postgres 9.1 eine Lösung nur getestet, die auf Oracle ROWNUM Nähe:

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

Ich habe das in 8.4 getestet und es funktioniert auch dort. – Mac

+3

Beachten Sie, dass dies eine ORDER BY in der äußeren Abfrage nicht berücksichtigt. –

7

Postgresql haben Limit.

Oracle Code:

select * 
from 
    tbl 
where rownum <= 1000; 

gleichen in PostgreSQLs Code:

select * 
from 
    tbl 
limit 1000 
0

die Grenze clausule verwenden, mit dem Offset auf die Zeilennummer wählen -1 also, wenn u wollen die Nummer 8 Reihe bekommen so verwenden:

Grenze 1 Offset 7

0

Wenn Sie einen eindeutigen Schlüssel haben, können Sieverwenden

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