Есть ли способ имитировать rownum в postgresql?Rownum in postgresql
ответ
Postgresql> 8,4
SELECT
row_number() OVER (ORDER BY col1) AS i,
e.col1,
e.col2,
...
FROM ...
У Postgresql нет эквивалента ROWNUM от Oracle. Во многих случаях вы можете добиться того же результата, используя LIMIT и OFFSET в своем запросе.
-1 Это кажется неправильным, см принятый ответ ... –
+1 ROWNUM и ROW_NUMBER() OVER() не точно такой же – 2012-09-29 18:54:01
Если вы просто хотите номер, чтобы вернуться попробовать это.
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;
Не может быть самым быстрым, но это вариант, если он вам действительно нужен.
Я просто проверял в Postgres 9.1 раствор, близкий к Oracle ROWNUM:
select row_number() over() as id, t.*
from information_schema.tables t;
Я тестировал это в 8.4, и он там тоже работает. – Mac
Обратите внимание, что это не будет относиться к 'ORDER BY' во внешнем запросе. –
Postgresql имеют предел.
код компании Oracle:
select *
from
tbl
where rownum <= 1000;
же в коде PostGreSQL в:
select *
from
tbl
limit 1000
использовать предел clausule, со смещением, чтобы выбрать номер строки -1, так что если и хотят получить строку номер 8 так что используйте:
предел 1 смещение 7
Если у вас есть уникальный ключ, вы можете использовать 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 |
Будьте осторожны. Это похоже на rownum оракула, но немного отличается. Oracle rownum назначается во время чтения строки с диска, тогда как this row_number() назначается в зависимости от того, что находится в вашем OVER – Royce
. Что относительно различий в скорости? – Nashev