В PostGIS возможно ли создать вид с уникальным идентификатором?

24

Когда я создаю представление в PostGIS, есть ли способ добавить уникальный идентификатор в это представление? Как поле «gid» в любой другой таблице PostGIS?

Изменить: Извините, я должен был включить это в исходное сообщение. Я использую PostGresql 9.0 и PostGIS 1.5.

Ando

Ando
источник

Ответы:

29

Вы должны иметь возможность использовать функцию row_number () в качестве столбца в вашем представлении. Это работает для Postgres 8.4 или выше.

http://www.postgresql.org/docs/current/static/functions-window.html

SELECT * FROM
( SELECT
    ROW_NUMBER() OVER (ORDER BY column_to_sort_by ASC) AS ROW_NUMBER,
    Col1, Col2
  FROM table_name
) myview_name

Это должно работать в большинстве баз данных, включая SQL Server, Oracle и MySQL.

geographika
источник
Круто - я отдам это назад и вернусь к тебе.
Андо
3
Вы также можете обойтись row_number() OVER() AS "id"без ORDERболее столбца
Falcacibar
Это, как правило, очень плохое проектное решение, так как row_numberфактически это случайное значение. Вы не можете зависеть от того, чтобы он был непротиворечивым SELECT, особенно когда меняются базовые данные.
jpmc26
@jpmc - по самой своей природе вид изменится, если изменится его базовая информация. Надежный идентификатор не является частью требований вопроса. Некоторые ГИС просто требуют уникальный идентификатор для каждого объекта, чтобы загрузить слой (например, ArcMap).
география
Я бы не стал доверять ArcMap для правильной работы с несовместимым идентификатором. Откуда вы знаете, что она не запрашивает базу данных при панорамировании, но не обновляет таблицу атрибутов? Тогда вы будете иметь несоответствие, пытаясь выбрать функции.
jpmc26
5

Для более старых версий PostgreSQL (<= 8.3) здесь есть другое решение. В этом примере я использую другое имя столбца vidдля «view ID».

Сначала создайте последовательность. Используйте его, CYCLEчтобы он зациклился, если вы достигнете конца последовательности.

CREATE SEQUENCE myview_vid_seq CYCLE;

Теперь создайте VIEW, который использует последовательность:

CREATE OR REPLACE VIEW myview AS 
 SELECT nextval('myview_vid_seq'::regclass) AS vid, mytable.*
 FROM mytable;
Майк Т
источник
Я еще не вернулся к работе, чтобы попробовать эти предложения. Но решение, которое вы предложили, это только для версий Postgresql <= 8.3? Я использую Postresql 9.0 и PostGIS 1.5.
Андо
1
Для вашей системы должен подойти как этот, так и ответ географии. Было бы хорошим тестом производительности, чтобы увидеть, какой из них быстрее. Я должен был сделать то, что вы спрашиваете в своем вопросе, чтобы просмотреть данные в QGIS, поэтому я предполагаю, что вы находитесь в аналогичной ситуации.
Майк Т
1
Идентичная ситуация, я бы сказал - Попытка объединить несколько слоев в представлении и требовать уникальный идентификатор для QGIS.
Андо