Di PostGIS, mungkinkah membuat Tampilan dengan ID unik?

24

Ketika saya membuat tampilan di PostGIS, adakah cara untuk menambahkan ID unik ke tampilan itu? Sama seperti bidang "gid" di tabel PostGIS lainnya?

Sunting: Maaf saya harus memasukkan ini dalam posting asli. Saya menggunakan PostGresql 9.0 dan PostGIS 1.5.

Ando

Ando
sumber

Jawaban:

29

Anda harus dapat menggunakan fungsi row_number () sebagai kolom dalam tampilan Anda. Ini berfungsi untuk Postgres 8.4 atau lebih tinggi.

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

Ini harus bekerja di sebagian besar database termasuk SQL Server, Oracle, dan MySQL.

geografi
sumber
Keren - Saya akan memberikannya lalu dan kembali kepada Anda.
Ando
3
Anda juga dapat melakukannya row_number() OVER() AS "id"tanpa ORDERkolom
falcacibar
Ini biasanya keputusan desain yang sangat buruk, seperti row_numberjuga nilai acak. Anda tidak bisa bergantung padanya konsisten di antara SELECTs, terutama ketika data yang mendasarinya berubah.
jpmc26
@jpmc - pada dasarnya tampilan akan berubah jika data dasarnya berubah. ID yang andal bukan bagian dari persyaratan pertanyaan. Beberapa GIS hanya memerlukan ID unik untuk setiap fitur hanya untuk memuat layer (misalnya ArcMap).
geografi
Saya tidak akan percaya ArcMap berfungsi dengan benar dengan ID yang tidak konsisten. Bagaimana Anda tahu itu tidak meminta database ketika Anda menggeser tetapi tidak me-refresh tabel atribut? Maka Anda akan memiliki ketidakcocokan mencoba memilih fitur.
jpmc26
5

Untuk PostgreSQL versi lama (<= 8.3), berikut ini adalah solusi lain. Dalam contoh ini, saya menggunakan nama kolom lain viduntuk "view ID".

Pertama, buat urutan. Gunakan CYCLEsehingga itu akan berulang jika Anda mencapai akhir urutan.

CREATE SEQUENCE myview_vid_seq CYCLE;

Sekarang, buat VIEW yang menggunakan urutan:

CREATE OR REPLACE VIEW myview AS 
 SELECT nextval('myview_vid_seq'::regclass) AS vid, mytable.*
 FROM mytable;
Mike T
sumber
Saya belum kembali bekerja untuk mencoba saran-saran ini. Tetapi solusi yang Anda sarankan adalah ini hanya untuk versi Postgresql <= 8.3? Saya menjalankan Postresql 9.0 dan PostGIS 1.5.
Ando
1
Untuk sistem Anda, ini dan jawaban geografi harus bekerja. Ini akan menjadi tes kinerja yang baik untuk melihat mana yang lebih cepat. Saya harus melakukan apa yang Anda tanyakan dalam pertanyaan Anda untuk melihat data di QGIS, jadi saya kira Anda berada dalam situasi yang sama.
Mike T
1
Situasi identik yang akan saya katakan - Mencoba menggabungkan beberapa layer dalam tampilan dan memerlukan id unik untuk QGIS.
Ando