2010-10-18 6 views

ответ

71

Postgresql> 8,4

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

Будьте осторожны. Это похоже на rownum оракула, но немного отличается. Oracle rownum назначается во время чтения строки с диска, тогда как this row_number() назначается в зависимости от того, что находится в вашем OVER – Royce

+0

. Что относительно различий в скорости? – Nashev

2

У Postgresql нет эквивалента ROWNUM от Oracle. Во многих случаях вы можете добиться того же результата, используя LIMIT и OFFSET в своем запросе.

+0

-1 Это кажется неправильным, см принятый ответ ... –

+3

+1 ROWNUM и ROW_NUMBER() OVER() не точно такой же – 2012-09-29 18:54:01

9

Если вы просто хотите номер, чтобы вернуться попробовать это.

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

Вы можете добавить заказ в inline_v1 SQL так что ваш ROWNUM имеет некоторый последовательный смысл ваших данных.

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

Не может быть самым быстрым, но это вариант, если он вам действительно нужен.

18

Я просто проверял в Postgres 9.1 раствор, близкий к Oracle ROWNUM:

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

Я тестировал это в 8.4, и он там тоже работает. – Mac

+3

Обратите внимание, что это не будет относиться к 'ORDER BY' во внешнем запросе. –

7

Postgresql имеют предел.

код компании Oracle:

select * 
from 
    tbl 
where rownum <= 1000; 

же в коде PostGreSQL в:

select * 
from 
    tbl 
limit 1000 
0

использовать предел clausule, со смещением, чтобы выбрать номер строки -1, так что если и хотят получить строку номер 8 так что используйте:

предел 1 смещение 7

0

Если у вас есть уникальный ключ, вы можете использовать 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