Ist es in PostGIS möglich, eine Ansicht mit einer eindeutigen ID zu erstellen?


24

Kann ich beim Erstellen einer Ansicht in PostGIS dieser Ansicht eine eindeutige ID hinzufügen? Genau wie das Feld "gid" in einer anderen PostGIS-Tabelle?

Edit: Sorry, ich hätte dies in den ursprünglichen Beitrag aufnehmen sollen. Ich benutze PostGresql 9.0 und PostGIS 1.5.

Ando

Antworten:


29

Sie sollten in der Lage sein, die Funktion row_number () als Spalte in Ihrer Ansicht zu verwenden. Dies funktioniert für Postgres 8.4 oder höher.

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

Dies sollte in den meisten Datenbanken funktionieren, einschließlich SQL Server, Oracle und MySQL.


Cool - ich gebe es her und melde mich wieder bei dir.
Ando

3
Sie können auch tun , row_number() OVER() AS "id"ohne ORDERüber Spalte
falcacibar

Dies ist normalerweise eine sehr schlechte Entwurfsentscheidung, da row_numberes sich tatsächlich um einen Zufallswert handelt. Sie können sich nicht darauf verlassen, dass es zwischen SELECTs konsistent ist , insbesondere wenn sich die zugrunde liegenden Daten ändern.
jpmc26

@jpmc - Eine Ansicht ändert sich naturgemäß, wenn sich die zugrunde liegenden Daten ändern. Eine zuverlässige ID ist nicht Teil der Fragenanforderungen. Einige GISs benötigen lediglich eine eindeutige ID für jedes Feature, um den Layer zu laden (z. B. ArcMap).
Geographika

Ich würde nicht darauf vertrauen, dass ArcMap mit einer inkonsistenten ID ordnungsgemäß funktioniert. Woher wissen Sie, dass die Datenbank beim Schwenken nicht abgefragt, aber die Attributtabelle nicht aktualisiert wird? In diesem Fall besteht ein Konflikt bei der Auswahl der Funktionen.
jpmc26

5

Für ältere Versionen von PostgreSQL (<= 8.3) ist hier eine andere Lösung. In diesem Beispiel verwende ich einen anderen Spaltennamen vidfür "Ansichts-ID".

Erstellen Sie zunächst eine Sequenz. Verwenden CYCLESie diese Option, um eine Schleife zu erstellen, falls Sie das Ende der Sequenz erreichen.

CREATE SEQUENCE myview_vid_seq CYCLE;

Erstellen Sie jetzt eine ANSICHT, die die folgende Sequenz verwendet:

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

Ich war noch nicht wieder in der Arbeit, um diese Vorschläge auszuprobieren. Die von Ihnen vorgeschlagene Lösung ist jedoch, dass dies nur für Postgresql-Versionen <= 8.3 gilt. Ich verwende Postresql 9.0 und PostGIS 1.5.
Ando

1
Für Ihr System sollten sowohl diese als auch die geografische Antwort funktionieren. Es wäre ein guter Leistungstest, um festzustellen, welcher schneller ist. Ich musste tun, was Sie in Ihrer Frage gefragt haben, um Daten in QGIS anzuzeigen. Ich schätze, Sie befinden sich in einer ähnlichen Situation.
Mike T

1
Identische Situation würde ich sagen - Der Versuch, ein paar Ebenen in einer Ansicht zu kombinieren und eine eindeutige ID für QGIS zu benötigen.
Ando
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.