Rownum in postgresql


Antworten:


89

Postgresql> 8.4

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

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;

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

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.


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.


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


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


Dies war genau das Bedürfnis, das ich hatte und es löste mein Problem. Vielen Dank!!
dbusern
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.