Rownum in postgresql

77

Gibt es eine Möglichkeit, Rownum in postgresql zu simulieren?

Nascar
quelle

Antworten:

89

Postgresql> 8.4

SELECT 
    row_number() OVER (ORDER BY col1) AS i, 
    e.col1, 
    e.col2, 
    ... 
FROM ... 
baklarz2048
quelle
12
Achtung. Dies ähnelt dem Rownum des Orakels, ist jedoch etwas anders. Das Rownum von Oracle wird zum Zeitpunkt des Lesens der Zeile von der Festplatte zugewiesen, während diese row_number () abhängig davon zugewiesen wird, was in Ihrem OVER
Royce
Was ist mit Geschwindigkeitsunterschieden?
Nashev
26

Ich habe gerade in Postgres 9.1 eine Lösung getestet, die Oracle ROWNUM nahe kommt:

select row_number() over() as id, t.*
from information_schema.tables t;
Wolfgang Vollmann
quelle
4
Beachten Sie, dass dies eine ORDER BYin der äußeren Abfrage nicht berücksichtigt.
Gordon Linoff
24

Postgresql haben Limit.

Oracle-Code:

select *
from
  tbl
where rownum <= 1000;

Gleiches gilt für Postgresqls Code:

select *
from
  tbl
limit 1000
Buka
quelle
9

Wenn Sie nur möchten, dass eine Nummer zurückkommt, versuchen Sie dies.

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 der SQL inline_v1 eine Reihenfolge hinzufügen, damit Ihr ROWNUM eine sequentielle Bedeutung für Ihre Daten hat.

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.

Kuberchaun
quelle
3

Postgresql hat kein Äquivalent zu Oracle ROWNUM. In vielen Fällen können Sie das gleiche Ergebnis erzielen, indem Sie LIMIT und OFFSET in Ihrer Abfrage verwenden.

Sachin Shanbhag
quelle
1

Verwenden Sie die Grenzwertklausel mit dem Versatz, um die Zeilennummer -1 zu wählen. Wenn Sie also die Zeile mit der Nummer 8 erhalten möchten, verwenden Sie:

Limit 1 Offset 7

Lorenzo Zuluaga
quelle
1

Wenn Sie einen eindeutigen Schlüssel haben, können Sie diesen verwenden 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

Kaushik Nayak
quelle
Dies war genau das Bedürfnis, das ich hatte und es löste mein Problem. Vielen Dank!!
dbusern