En PostGIS, ¿es posible crear una Vista con una ID única?


24

Cuando creo una vista en PostGIS, ¿hay alguna forma de agregar una ID única a esa vista? ¿Al igual que el campo "gid" en cualquier otra tabla PostGIS?

Editar: Lo siento, debería haber incluido esto en la publicación original. Estoy usando PostGresql 9.0 y PostGIS 1.5.

Ando

Respuestas:


29

Debería poder usar la función row_number () como una columna en su vista. Esto funciona para Postgres 8.4 o 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

Esto debería funcionar en la mayoría de las bases de datos, incluidos SQL Server, Oracle y MySQL.


Genial, te lo daré y te responderé.
Ando

3
También puede row_number() OVER() AS "id"prescindir de ORDERmás de la columna
falcacibar

Esta suele ser una decisión de diseño muy pobre, ya row_numberque efectivamente es un valor aleatorio. No puede depender de que sea coherente entre SELECTs, especialmente cuando cambian los datos subyacentes.
jpmc26

@jpmc: por su propia naturaleza, una vista cambiará si sus datos subyacentes cambian. Una identificación confiable no es parte de los requisitos de la pregunta. Algunos SIG simplemente requieren una ID única para cada entidad solo para cargar la capa (por ejemplo, ArcMap).
geographika

No confiaría en ArcMap para funcionar correctamente con una ID inconsistente. ¿Cómo sabe que no vuelve a consultar la base de datos cuando realiza una panorámica pero no actualiza la tabla de atributos? Entonces tendría una falta de coincidencia al intentar seleccionar características.
jpmc26

5

Para versiones anteriores de PostgreSQL (<= 8.3), aquí hay otra solución. En este ejemplo, uso otro nombre de columna vidpara "ver ID".

Primero, crea una secuencia. Úselo CYCLEpara que se repita en caso de que llegue al final de la secuencia.

CREATE SEQUENCE myview_vid_seq CYCLE;

Ahora, cree una VISTA que use la secuencia:

CREATE OR REPLACE VIEW myview AS 
 SELECT nextval('myview_vid_seq'::regclass) AS vid, mytable.*
 FROM mytable;

Todavía no he vuelto a trabajar para probar estas sugerencias. ¿Pero la solución que ha sugerido es esto solo para versiones de Postgresql <= 8.3? Estoy ejecutando Postresql 9.0 y PostGIS 1.5.
Ando

1
Para su sistema, tanto esta como la respuesta de geographika deberían funcionar. Sería una buena prueba de rendimiento para ver cuál es más rápido. He tenido que hacer lo que usted pide en su pregunta para ver los datos en QGIS, por lo que supongo que se encuentra en una situación similar.
Mike T

1
Situación idéntica, diría: intentar combinar algunas capas en una vista y requerir una identificación única para QGIS.
Ando
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.