2010-10-18 17 views

cevap

71

Postgresql>

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

dikkat edilmez bkz. Bu, kahinin rolüne benzer, ama biraz farklı. Oracle'ın rownum'u diskten satır okunurken atanır, oysa bu row_number() OVER – Royce

+0

'unuza bağlı olarak atanır Hız farkları hakkında ne var? – Nashev

2

Postgresql'in Oracle'ın ROWNUM eşdeğeri yoktur. Çoğu durumda, aynı sonucu, sorgunuzda LIMIT ve OFFSET kullanarak elde edebilirsiniz.

+0

-kabul cevabı ... –

+3

1 ROWNUM ve ROW_NUMBER() AŞIRI() tam olarak aynı –

9

sadece bir sayı bu deneyin geri gelmek isterseniz 8.4. senin ROWNUM verilerinize bazı sıralı bir anlamı vardır, böylece

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

Sen inline_v1 SQL tarafından bir emri ekleyebilirsiniz.

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

En hızlı olmayabilir, ancak gerçekten onlara ihtiyacınız varsa bir seçenek.

18

Sadece Postgres 9.1 Oracle ROWNUM yakın bir çözüm olarak test ettik:

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

Bunu 8.4'te test ettim ve orada da çalışıyor. – Mac

+3

Bunun, dış sorguda bir 'SİPARİŞ BY'e uymayacağını unutmayın. –

7

Postgresql sınırı vardır.

Oracle'ın kodu:

select * 
from 
    tbl 
where rownum <= 1000; 

PostgreSQL kodunda aynı:

select * 
from 
    tbl 
limit 1000 
0

satır numarasını -1 öyleyse seçim için ofset ile sınır clausule kullanmak u wanna 8 numaralı satır olsun böylece kullanın:

limiti 1 7

0

ofset Eğer benzersiz bir anahtar varsa,kullanabilir

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 | 
yanlış gibi görünüyor

DEMO