Indexspalte in view anlegen

Hallo,
Ich möchte jene Polygone von “table” zusammenfügen, die einen bestimmten gridcode haben (5052 und 3001) und aneinander grenzen. Das Ergebnis würde ich gerne in QGis ansehen,aber mir fehlt in dem Fall eine Spalte als eindeutiger Schlüssel. Wie lege ich so eine an, die einfach automatisch 1,2,3,… reinschreibt? :confused: intern arbeitet postgre ja mit solchen oid. kann ich die sichtbar machen?

Danke schon mal im Voraus!

Mein code für View merge:

CREATE OR REPLACE VIEW merge AS
SELECT a.gridcode,
(a.area + b.area) AS ges_area,
a.area AS area_a,
b.area AS area_b,
st_union(a.the_geom, b.the_geom) AS geom_merge

FROM table a, table b
WHERE a.gridcode = 5052 AND b.gridcode = 3001 AND st_touches(a.the_geom, b.the_geom);

Die OID kann man sichtbar machen, ja. Select oid, * from table; Ist aber eine schlechte Idee, vergiß sie also. Nimm eine Sequence für sowas.

Andreas

Ok, Sequenz versteh ich… Type serial. Theoretisch klar.
Aber wie bekomme ich diese Spalte zu meiner VIEW dazu?
Bitte um Hilfe!



test=# select * from foo;
  name
---------
 andreas
 anja
 magda
 katha
 tamara
(5 Zeilen)

Zeit: 0,221 ms
test=*# create sequence foo_seq;
CREATE SEQUENCE
Zeit: 85,397 ms
test=*# create view foo_view as select nextval('foo_seq'), name from foo;
CREATE VIEW
Zeit: 86,063 ms
test=*# select * from foo_view;
 nextval |  name
---------+---------
       1 | andreas
       2 | anja
       3 | magda
       4 | katha
       5 | tamara
(5 Zeilen)

Zeit: 0,308 ms
test=*# select * from foo_view;
 nextval |  name
---------+---------
       6 | andreas
       7 | anja
       8 | magda
       9 | katha
      10 | tamara
(5 Zeilen)

Nachteil, wie man sieht: die Spalte erhöht sich immer weiter, man müßte also die Sequence zurücksetzen vor neubenutzung.

Alternative 1: eine SRF schreiben, die das macht
Alternative 2: 8.4 benutzen, ist ja seit gestern da. Dieses hat eine row_number() - Funktion.

Alternative 2 ist deutlich zu bevorzugen.

Andreas

danke super! das funktioniert.
die neue version werd ich mir mal ansehen um es auf die elegantere weise zu lösen!
thx und schönen tag noch

Leider ergibt sich in diesem Zusammenhang noch ein Problem.
Will man das/die/den View in QGIS anzeigen lassen jammert das Prgramm keine eindeutige Spalte zu finden und ladet somit nichts. QGIS will eine spalte vom typ int4 und nicht bigint, wie von nextval(‘foo_seq’) zurückgegeben wird. Hab schon gesucht wie ich von dem bigint zum int komm, aber ohne erfolg…
bitte nochmals um hilfe :slight_smile:

Das ist ein bekanntes Problem bei der Arbeit mit Geodaten. Die bösen Clients wollen immer eine eindeutige ID in Form eines Keys für ihre Geometrien, sonst machen die nix oder nur wenig, die Schlingel (ArcGIS, UMN, UDig etc.) :wink: Das macht oft Probleme wenn Daten nicht nur selektiert werden, sondern eben aggregiert werden und quasi ‘neue’ Elemente entstehen. Das hat nur begrenzt was mit der DB zu tun sondern eher mit dem generellen Handling der Daten im GIS-Client.

Du könntest eventuell das Ergebnis des nextval in ein int4 casten, aber ich bin mir nicht sicher, ob das die Lösung deines Problems sein wird.
Vor allem aber werden solche Layer aus Views auch oft extrem langsam im Aufbau im Client, vor allen wenn eben geometrische Aggregate wie st_union etc beteiligt sind. Eine weitere Abhilfe wären hier z.B. das Postgres-Äquivalent zu Materialized Views, vielleicht hilft ja dieser Link weiter.

Grüssle Uwe

das mit dem casten funktioniert zwar gut (wusste nicht, dass ich es direkt in der viewerzeugung anwenden kann), aber das dummer QGIS ist natürlich trotz typ INT jetzt noch nicht zufrieden. Die eindeutige Spalte soll von Datensätzen der verwendeteten Tabellen fürs View kommen, was ja in meinem Fall nicht funktioniert. Die uber nexval(sequenz) generierte Spalte wird nicht akzeptiert… grrrr
somit wird mit ja nur noch das mit den materialized views überblieben… danke für den link.