PostGISでは、一意のIDを持つビューを作成できますか?


24

PostGISでビューを作成するときに、そのビューに一意のIDを追加する方法はありますか?他のPostGISテーブルの「gid」フィールドと同じように?

編集:申し訳ありませんが、元の投稿にこれを含めるべきでした。PostGresql 9.0およびPostGIS 1.5を使用しています。

安藤

回答:


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を含むほとんどのデータベースで動作するはずです。


クール-それを前に差し上げて、あなたに戻ってきます。
安藤

3
オーバーコラムrow_number() OVER() AS "id"なしORDERで行うこともできます
-falcacibar

事実上ランダムな値であるため、これは通常、非常に貧弱な設計決定row_numberです。SELECT特に基礎となるデータが変更された場合、s 間の一貫性に依存することはできません。
jpmc26

@jpmc-その性質上、基礎となるデータが変更されるとビューも変更されます。信頼できるIDは質問の要件の一部ではありません。一部のGISでは、レイヤー(ArcMapなど)を読み込むためだけに、各フィーチャに一意のIDが必要です。
geographika

一貫性のないIDでArcMapが適切に機能するとは思わないでしょう。属性テーブルをパンしても更新しない場合、データベースを再クエリしないことをどのように確認しますか?次に、機能を選択しようとして不一致が生じます。
jpmc26

5

古いバージョンのPostgreSQL(<= 8.3)の場合、別のソリューションがあります。この例ではvid、「ビュー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
お使いのシステムでは、これとgeographikaの答えの両方が機能するはずです。どちらが高速であるかを確認するには、優れたパフォーマンステストになります。QGISでデータを表示するには、質問であなたがしなければならないことをしなければならなかったので、あなたも同じような状況にあると思います。
マイクT

1
私が言うであろう同一の状況-ビュー内のいくつかのレイヤーを結合し、QGISに一意のIDを要求しようとしています。
安藤
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.