2010-10-18 11 views

Répondre

71

Postgresql> 8,4

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

Soyez prudent. C'est semblable au rownum d'oracle, mais c'est légèrement différent. Oracle rownum est assigné au moment de la lecture de la ligne à partir du disque, alors que ce row_number() est attribué en fonction de ce qui est dans votre OVER – Royce

+0

Qu'en est-il des différences de vitesse? – Nashev

2

Postgresql n'a pas d'équivalent de ROWNUM d'Oracle. Dans de nombreux cas, vous pouvez obtenir le même résultat en utilisant LIMIT et OFFSET dans votre requête.

+0

-1 Cela semble être mal, voir la réponse acceptée ... –

+3

+1 ROWNUM et ROW_NUMBER() OVER() ne sont pas exactement les mêmes –

9

Si vous voulez juste un numéro à venir essayer de nouveau ce sujet.

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

Vous pouvez ajouter une commande par le SQL inline_v1 de sorte que votre ROWNUM a une signification séquentielle à vos données. Peut-être pas le plus rapide, mais c'est une option si vous en avez vraiment besoin.

18

Je viens de tester dans Postgres 9.1 une solution qui est proche de Oracle ROWNUM:

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

J'ai testé cela en 8.4 et ça marche là aussi. – Mac

+3

Notez que cela ne respecte pas un 'ORDER BY' dans la requête externe. –

7

Postgresql ont limite.

code d'Oracle:

select * 
from 
    tbl 
where rownum <= 1000; 

même dans le code de Postgresql:

select * 
from 
    tbl 
limit 1000 
0

utiliser la clausule limite, avec le décalage de choisir le numéro de ligne -1 si u voulez obtenir le numéro 8 ligne utilisez donc:

limite 1 décalage 7

0

Si vous avez une clé unique, vous pouvez utiliser 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