Gibt es eine Möglichkeit, Rownum in postgresql zu simulieren?
Antworten:
Postgresql> 8.4
SELECT
row_number() OVER (ORDER BY col1) AS i,
e.col1,
e.col2,
...
FROM ...
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;
ORDER BY
in der äußeren Abfrage nicht berücksichtigt.
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.
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.
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
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 |