No PostGIS, é possível criar uma View com um ID exclusivo?

24

Quando crio uma visualização no PostGIS, há alguma maneira de adicionar um ID exclusivo a essa visualização? Assim como o campo "gid" em qualquer outra tabela PostGIS?

Edit: Desculpe, eu deveria ter incluído isso no post original. Estou usando o PostGresql 9.0 e o PostGIS 1.5.

Ando

Ando
fonte

Respostas:

29

Você deve poder usar a função row_number () como uma coluna em sua exibição. Isso funciona para o Postgres 8.4 ou superior.

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

Isso deve funcionar na maioria dos bancos de dados, incluindo SQL Server, Oracle e MySQL.

geographika
fonte
Legal - eu darei isso atrás e volto para você.
Ando
3
Você também pode fazer row_number() OVER() AS "id"sem ORDERcoluna sobre
falcacibar
Geralmente, é uma decisão de projeto muito ruim, pois row_numberé efetivamente um valor aleatório. Você não pode depender da consistência entre SELECTs, principalmente quando os dados subjacentes são alterados.
jpmc26 25/01
@jpmc - por sua própria natureza, uma exibição será alterada se os dados subjacentes forem alterados. Um ID confiável não faz parte dos requisitos da pergunta. Alguns GISs simplesmente exigem um ID exclusivo para cada recurso apenas para carregar a camada (por exemplo, ArcMap).
geographika
Eu não confiaria que o ArcMap funcionasse corretamente com um ID inconsistente. Como você sabe que ele não solicita o banco de dados quando faz o pan, mas não atualiza a tabela de atributos? Então você teria uma incompatibilidade tentando selecionar os recursos.
jpmc26 25/01
5

Para versões mais antigas do PostgreSQL (<= 8.3), aqui está outra solução. Neste exemplo, eu uso outro nome de coluna vidpara "view ID".

Primeiro, crie uma sequência. Use CYCLEpara que ele faça um loop no caso de você chegar ao final da sequência.

CREATE SEQUENCE myview_vid_seq CYCLE;

Agora, crie uma VIEW que use a sequência:

CREATE OR REPLACE VIEW myview AS 
 SELECT nextval('myview_vid_seq'::regclass) AS vid, mytable.*
 FROM mytable;
Mike T
fonte
Ainda não voltei ao trabalho para tentar essas sugestões. Mas a solução que você sugeriu é apenas para as versões do Postgresql <= 8.3? Estou executando o Postresql 9.0 e o PostGIS 1.5.
Ando
11
Para o seu sistema, a resposta desta e da geographika deve funcionar. Seria um bom teste de desempenho ver qual deles é mais rápido. Eu tive que fazer o que você pediu na sua pergunta para visualizar os dados no QGIS, então acho que você está em uma situação semelhante.
Mike T
11
Situação idêntica, eu diria - Tentando combinar algumas camadas em uma exibição e exigir um ID exclusivo para o QGIS.
Ando