In PostGIS è possibile creare una vista con un ID univoco?


24

Quando creo una vista in PostGIS, c'è un modo per aggiungere un ID univoco a quella vista? Proprio come il campo "gid" in qualsiasi altra tabella PostGIS?

Modifica: mi dispiace che avrei dovuto includerlo nel post originale. Sto usando PostGresql 9.0 e PostGIS 1.5.

Ando

Risposte:


29

Dovresti essere in grado di utilizzare la funzione row_number () come colonna nella tua vista. Questo funziona con Postgres 8.4 o versioni successive.

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

Questo dovrebbe funzionare nella maggior parte dei database, inclusi SQL Server, Oracle e MySQL.


Fantastico - te lo darò fa e ti risponderò.
Ando,

3
Puoi anche fare a row_number() OVER() AS "id"meno della ORDERcolonna
Over

Di solito si tratta di una decisione di progettazione molto scadente, in quanto row_numberè effettivamente un valore casuale. Non puoi dipendere dal fatto che sia coerente tra SELECTs, in particolare quando i dati sottostanti cambiano.
jpmc26,

@jpmc - per sua stessa natura una vista cambierà se i suoi dati sottostanti cambiano. Un ID affidabile non fa parte dei requisiti della domanda. Alcuni GIS richiedono semplicemente un ID univoco per ogni funzione solo per caricare il layer (ad esempio ArcMap).
geographika

Non mi fiderei che ArcMap funzioni correttamente con un ID incoerente. Come fai a sapere che non richiede il database quando esegui il pan ma non aggiorni la tabella degli attributi? Quindi avresti una discrepanza nel tentativo di selezionare le funzionalità.
jpmc26,

5

Per le versioni precedenti di PostgreSQL (<= 8.3), ecco un'altra soluzione. In questo esempio, utilizzo un altro nome di colonna vidper "visualizza ID".

Innanzitutto, crea una sequenza. Usalo in CYCLEmodo che si chiuda nel caso in cui raggiungi la fine della sequenza.

CREATE SEQUENCE myview_vid_seq CYCLE;

Ora, crea una VISTA che utilizza la sequenza:

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

Non sono ancora tornato al lavoro per provare questi suggerimenti. Ma la soluzione che hai suggerito è questa solo per le versioni Postgresql <= 8.3? Sto eseguendo Postresql 9.0 e PostGIS 1.5.
Ando,

1
Per il tuo sistema, sia questa che la risposta di geographika dovrebbero funzionare. Sarebbe un buon test delle prestazioni per vedere quale è più veloce. Ho dovuto fare ciò che chiedi nella tua domanda per visualizzare i dati in QGIS, quindi immagino che tu sia in una situazione simile.
Mike T,

1
Situazione identica direi: cercare di combinare alcuni livelli in una vista e richiedere un ID univoco per QGIS.
Ando,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.