source: trunk/import/sichten.sql @ 330

Revision 330, 45.7 KB checked in by frank.jaeger, 7 years ago (diff)

Umstellung von PostNAS 0.7 auf PostNAS 0.8, ohne Tabelle "alkis_beziehungen".

Line 
1-- =====
2-- ALKIS
3-- =====
4
5--  PostNAS 0.8
6
7--  -----------------------------------------
8--  Sichten fÃŒr Fehlersuche und Daten-Analyse
9--  -----------------------------------------
10
11--  Dieses SQL braucht nur bei Bedarf in einer PostNAS-DB verarbeitet werden.
12--  Es werden zusÀtzliche Views eingerichtet, die nur bei Fehlersuche und Analyse (vom Entwickler) benötigt werden.
13
14--  2012-04-17 flstnr_ohne_position
15--  2012-04-24 pauschal Filter 'endet IS NULL' um historische Objekte auszublenden
16--  2012-10-29 Redundanzen in Beziehungen suchen (entstehen durch replace)
17--  2013-02-20 Mehrfache Buchungsstellen zum FS suchen, dies sind Auswirkungen eines Fehlers bei Replace
18--  2013-03-05 Beschriftungen aus ap_pto auseinander sortieren, neuer View "grenzpunkt"
19--  2013-03-12 Optimierung Hausnummern, View "gebaeude_txt" (Funktion und Name)
20--  2013-04-15 UnterdrÃŒcken doppelter Darstellung in den Views 'ap_pto_stra', 'ap_pto_nam', 'ap_pto_rest'
21--  2013-04-16 Thema "BodenschÀtzung" und fehlernde Kommentare zum Views ergÀnzt.
22--             Diese Datei aufgeteilt in "sichten.sql" und "sichten_wms.sql"
23--  2013-10-23 Fehlersuche GebÀude-Hausnummer-Relation
24--  2013-11-26 Neue Views (doppelverbindung)
25--  2014-01-17 View "exp_csv" fÃŒr den Export von CSV-Daten aus der Auskunft mit Modul alkisexport.php.
26--  2014-01-20 Erweiterung "exp_csv" fÃŒr alkisexport.php
27--  2014-01-21 In "exp_csv": Rechtsgemeinsachaft zu allen Personen statt als eigener Satz.
28--  2014-01-27 Neuer Baustein "flst_an_strasse". Neuer View "exp_csv_str" fÃŒr CSV-Export von Flst. an einer Straße
29--  2014-01-29 Neuer View "strasse_als_gewanne" zur Fehlersuche.
30--  2014-01-31 Kommentar
31--  2014-02-06 nachmigration_aehnliche_anschriften
32--  2014-09-02 Die Tabelle "alkis_beziehungen" ÃŒberflÃŒssig machen.
33--             Relationen nun direkt ÃŒber neue Spalten in den Objekttabellen.
34
35-- Bausteine fÃŒr andere Views:
36-- ---------------------------
37
38-- Ein View, der die Verbindung von FlurstÌck zur Buchung fÌr zwei verschiedene FÀlle herstellt.
39-- Einmal die "normalen" (direkten) Buchungen.
40-- Zweitens ÃŒber die Rechte von Buchungsstellen an anderen Buchungsstellen.
41-- Dies kann als "MittelstÃŒck" in den anderen Views eingefÃŒgt werden.
42
43-- Einfach/Direkt:
44--   FlurstÃŒck   >istGebucht>                         (Buchungs-Stelle)
45--
46-- Mit "Recht an":
47--   FlurstÃŒck   >istGebucht>  Buchungs-Stelle  <an<  (Buchungs-Stelle)
48--                               (dienend)              (herrschend)
49
50--           DROP VIEW public.doppelverbindung;
51
52CREATE OR REPLACE VIEW public.doppelverbindung
53AS
54  -- FS >istGebucht> Buchungstelle
55  SELECT f1.gml_id             AS fsgml,    -- gml_id FlurstÃŒck
56         b1.gml_id             AS bsgml,    -- gml_id Buchungs
57         0                     AS ba_dien
58    FROM ax_flurstueck f1
59    JOIN ax_buchungsstelle b1   ON f1.istgebucht = b1.gml_id
60 UNION
61  -- FS >istGebucht> Buchungstelle  <an<  Buchungstelle
62  SELECT f2.gml_id              AS fsgml,   -- gml_id FlurstÃŒck
63         b2.gml_id              AS bsgml,   -- gml_id Buchung - (herrschendes GB)
64         dien.buchungsart       AS ba_dien  -- Ein Feld aus der Zwischen-Buchung zur Fall-Unterscheidung
65    FROM ax_flurstueck f2
66    JOIN ax_buchungsstelle dien ON f2.istGebucht = dien.gml_id
67    JOIN ax_buchungsstelle b2   ON dien.gml_id = ANY (b2.an)
68    WHERE dien.endet IS NULL;  -- FÃŒr das zusÀtzliche Verbindungselement die Historie hier ausschließen,
69                               -- FÃŒr andere Tabellen muss dies in dem View erfolgen, der dies verwendet.
70
71COMMENT ON VIEW public.doppelverbindung
72 IS 'ALKIS-Beziehung von FlurstÃŒck zu Buchung. UNION-Zusammenfassung des einfachen Falls mit direkter Buchung und des Falles mit Recht einer Buchungsstelle an einer anderen Buchungsstelle.';
73
74-- Test-Ausgabe: Ein paar FÀlle mit "Recht an"
75--   SELECT * FROM doppelverbindung WHERE ba_dien > 0 LIMIT 20;
76
77
78-- Ein View, der die Verbindung von FlurstÃŒck zur Straßentabelle fÃŒr zwei verschiedene FÀlle herstellt.
79-- Einmal ÃŒber die Lagebezeichnung MIT Hausnummer und einmal OHNE.
80-- Dies kann als "MittelstÃŒck" in den anderen Views eingefÃŒgt werden.
81
82--           DROP VIEW public.flst_an_strasse;
83
84CREATE OR REPLACE VIEW public.flst_an_strasse
85AS
86  -- FlurstÃŒck >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
87  SELECT fm.gml_id AS fsgml,
88         sm.gml_id AS stgml,                 -- Filter: gml_id der Straße
89         'm' AS fall                         -- SÀtze unterschieden: Mit HsNr
90    FROM ax_flurstueck fm                    -- FlurstÃŒck Mit
91    JOIN ax_lagebezeichnungmithausnummer lm  -- Lage MIT
92      ON lm.gml_id = ANY (fm.weistauf) 
93    JOIN ax_lagebezeichnungkatalogeintrag sm
94      ON lm.land=sm.land AND lm.regierungsbezirk=sm.regierungsbezirk AND lm.kreis=sm.kreis  AND lm.gemeinde=sm.gemeinde AND lm.lage=sm.lage
95   WHERE lm.endet IS NULL                    -- Verbinder nicht Historisch
96 UNION
97  -- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
98  SELECT fo.gml_id AS fsgml,
99         so.gml_id AS stgml,                 -- Filter: gml_id der Straße
100         'o' AS fall                         -- SÀtze unterschieden: Ohne HsNr
101    FROM ax_flurstueck fo                    -- FlurstÃŒck OHNE
102    JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
103      ON lo.gml_id = ANY (fo.zeigtauf) 
104    JOIN ax_lagebezeichnungkatalogeintrag so -- Straße OHNE
105      ON lo.land=so.land AND lo.regierungsbezirk=so.regierungsbezirk AND lo.kreis=so.kreis AND lo.gemeinde=so.gemeinde AND lo.lage=so.lage
106   WHERE lo.endet IS NULL;                   -- Verbinder nicht Historisch
107
108COMMENT ON VIEW public.flst_an_strasse
109 IS 'ALKIS-Beziehung von FlurstÃŒck zu Straßentabelle. UNION-Zusammenfassung der FÀlle MIT und OHNE Hausnummer.';
110
111-- Muss man noch dafÃŒr sorgen, dass FlurstÃŒck nicht doppelt vorkommt? z.B. mit DISTINCT
112-- Oder mÃŒssen ggf. mehrfache FS im Programm ÃŒbersprungen werden?
113
114-- Test-Ausgabe:
115--   SELECT * FROM flst_an_strasse WHERE stgml='DENW18AL000004Fl' LIMIT 40;
116
117-- Ende "Bausteine"
118
119
120-- Generelle Export-Struktur "FlurstÃŒck - Buchung - Grundbuch - Person"
121-- --------------------------------------------------------------------
122-- Verwendet den gespeicherten View "doppelverbindung".
123-- Wird benötigt im Auskunft-Modul "alkisexport.php":
124-- Je nach aufrufendem Modul wird der Filter (WHERE) an anderer Stelle gesetzt (gml_id von FS, GB oder Pers.)
125-- FÃŒr Filter nach "Straße" siehe die nachfolgende Sonderversion "exp_csv_str".
126
127-- Problem / Konflikt:
128-- Es kann nur eine lineare Struktur aus Spalten und Zeilen exportiert werden.
129-- Wenn nicht nur die Daten des Ausgangs-Objektes exportiert werden, sondern auch verbundene Tabellen in
130-- einer 1:N-Struktur, dann verdoppeln sich Zeileninhalte und es werden redundante Daten erzeugt.
131-- Diese Redundanzen mÃŒssen vom dem Programm gefiltert werden, das die Daten ÃŒber eine Schnittstelle einliest.
132
133-- Anwendungs-Beispiel: Abrechnung von AnliegerbeitrÀgen.
134
135--           DROP VIEW exp_csv;
136
137CREATE OR REPLACE VIEW exp_csv
138AS
139 SELECT
140  -- FlurstÃŒck
141    f.gml_id                             AS fsgml,       -- möglicher Filter FlurstÃŒcks-GML-ID
142    f.flurstueckskennzeichen             AS fs_kennz,
143    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
144    f.flurnummer, f.zaehler, f.nenner,
145    f.amtlicheflaeche                    AS fs_flae,
146    g.bezeichnung                        AS gemarkung,
147
148  -- Grundbuch
149    gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
150    gb.bezirk                            AS gb_bezirk,
151    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
152    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
153
154  -- Buchungsstelle (GrundstÃŒck)
155    s.laufendenummer                     AS bu_lfd,      -- BVNR
156  --s.zaehler, s.nenner,                                 -- Anteil des GB am FS, einzelne Felder
157    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
158    s.buchungsart,                                       -- verschlÃŒsselt
159    b.bezeichner                         AS bu_art,      -- Buchungsart entschlÃŒsselt
160
161  -- NamensNummer (Normalfall mit Person)
162    nn.laufendenummernachdin1421         AS nam_lfd,
163    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,         -- als Excel-Formel
164
165  -- Rechtsgemeinsachaft (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
166    rg.artderrechtsgemeinschaft          AS nam_adr,
167    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
168
169  -- Person
170    p.gml_id                             AS psgml,           -- möglicher Filter Personen-GML-ID
171    p.anrede,
172    p.vorname,
173    p.namensbestandteil,
174    p.nachnameoderfirma,                                     -- Familienname
175    p.geburtsdatum,
176    --p.geburtsname, p.akademischergrad
177 
178  -- Adresse der Person
179    a.postleitzahlpostzustellung         AS plz,
180    a.ort_post                           AS ort,             -- Anschreifenzeile 1: PLZ+Ort
181    a.strasse,  a.hausnummer,                                -- Anschriftenzeile 2: Straße+HsNr
182    a.bestimmungsland                    AS land
183
184  FROM ax_flurstueck    f               -- FlurstÃŒck
185  JOIN doppelverbindung d               -- beide FÀlle ÃŒber Union-View: direkt und ÃŒber Recht von Buchung an Buchung
186    ON d.fsgml = f.gml_id
187  JOIN ax_gemarkung g                   -- entschlÃŒsseln
188    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
189  JOIN ax_buchungsstelle s              -- Buchungs-Stelle
190    ON d.bsgml = s.gml_id
191  JOIN ax_buchungsstelle_buchungsart b  -- EnstschlÃŒsselung der Buchungsart
192    ON s.buchungsart = b.wert
193  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
194    ON gb.gml_id = s.istbestandteilvon
195  JOIN ax_buchungsblattbezirk z
196    ON gb.land=z.land AND gb.bezirk=z.bezirk
197  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
198    ON gb.gml_id = nn.istbestandteilvon
199  JOIN ax_person p                      -- NamNum >benennt> Person
200    ON p.gml_id = nn.benennt
201  LEFT JOIN ax_anschrift a
202    ON a.gml_id = ANY (p.hat)
203
204  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen:
205  -- Noch mal "GB -> NamNum", aber dieses Mal fÃŒr "Rechtsgemeinschaft".
206  -- Kommt max. 1 mal je GB vor und hat keine Relation auf Person.
207  LEFT JOIN
208   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft
209       FROM ax_namensnummer r
210       JOIN ax_buchungsblatt gr
211         ON r.istbestandteilvon = gr.gml_id  -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
212      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
213   ON rg.gml_id = gb.gml_id  -- zum GB
214
215  WHERE f.endet IS NULL AND s.endet IS NULL and gb.endet IS NULL and nn.endet IS NULL AND p.endet IS NULL
216
217  ORDER BY f.flurstueckskennzeichen,
218           gb.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, s.laufendenummer,
219           nn.laufendenummernachdin1421;
220
221COMMENT ON VIEW exp_csv
222 IS 'View fÃŒr einen CSV-Export aus der Buchauskunft mit alkisexport.php. Generelle Struktur. FÃŒr eine bestimmte gml_id noch den Filter setzen.';
223
224
225-- Variante des View "exp_csv":
226-- Hier wird zusÀtzlich der Baustein "flst_an_strasse" verwendet.
227-- Der Filter "WHERE stgml= " auf die "gml_id" von "ax_lagebezeichnungkatalogeintrag" sollte gesetzt werden
228-- um alle FlurstÃŒcke zu bekommen, die an einer Straße liegen.
229
230-- DROP           VIEW exp_csv_str;
231
232CREATE OR REPLACE VIEW exp_csv_str
233AS
234 SELECT
235    l.stgml,                                             -- Filter: gml_id aus "ax_lagebezeichnungkatalogeintrag"
236                                                         -- UNTERSCHIED zu exp_csv)
237
238  -- FlurstÃŒck
239    f.gml_id                             AS fsgml,       -- Gruppenwechsel fÃŒr "function lage_zum_fs" in alkisexport.php
240    f.flurstueckskennzeichen             AS fs_kennz,
241    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
242    f.flurnummer, f.zaehler, f.nenner,
243    f.amtlicheflaeche                    AS fs_flae,
244    g.bezeichnung                        AS gemarkung,
245
246  -- Grundbuch
247  --gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
248    gb.bezirk                            AS gb_bezirk,
249    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
250    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
251
252  -- Buchungsstelle (GrundstÃŒck)
253    s.laufendenummer                     AS bu_lfd,      -- BVNR
254  --s.zaehler, s.nenner,                                 -- Anteil des GB am FS, einzelne Felder
255    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
256    s.buchungsart,                                       -- verschlÃŒsselt
257    b.bezeichner                         AS bu_art,      -- Buchungsart entschlÃŒsselt
258
259  -- NamensNummer (Normalfall mit Person)
260    nn.laufendenummernachdin1421         AS nam_lfd,
261    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,         -- als Excel-Formel
262
263  -- Rechtsgemeinsachaft (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
264    rg.artderrechtsgemeinschaft          AS nam_adr,
265    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
266
267  -- Person
268  --p.gml_id                             AS psgml,           -- möglicher Filter Personen-GML-ID
269    p.anrede,
270    p.vorname,
271    p.namensbestandteil,
272    p.nachnameoderfirma,                                     -- Familienname
273    p.geburtsdatum,
274    --p.geburtsname, p.akademischergrad
275 
276  -- Adresse der Person
277    a.postleitzahlpostzustellung         AS plz,
278    a.ort_post                           AS ort,             -- Anschreifenzeile 1: PLZ+Ort
279    a.strasse,  a.hausnummer,                                -- Anschriftenzeile 2: Straße+HsNr
280    a.bestimmungsland                    AS land
281
282  FROM ax_flurstueck    f               -- FlurstÃŒck
283  JOIN flst_an_strasse  l               -- Lage (hier zusÀtzlicher JOIN gegenÃŒber Version "exp_csv")
284        ON l.fsgml = f.gml_id
285  JOIN doppelverbindung d               -- beide FÀlle ÃŒber Union-View: direkt und ÃŒber Recht von Buchung an Buchung
286    ON d.fsgml = f.gml_id
287  JOIN ax_gemarkung g                   -- entschlÃŒsseln
288    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
289  JOIN ax_buchungsstelle s              -- Buchungs-Stelle
290    ON d.bsgml = s.gml_id
291  JOIN ax_buchungsstelle_buchungsart b  -- EnstschlÃŒsselung der Buchungsart
292    ON s.buchungsart = b.wert
293  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
294    ON gb.gml_id = s.istbestandteilvon
295  JOIN ax_buchungsblattbezirk z
296    ON gb.land=z.land AND gb.bezirk=z.bezirk
297  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
298    ON gb.gml_id = nn.istbestandteilvon
299  JOIN ax_person p                      -- NamNum >benennt> Person
300    ON p.gml_id = nn.benennt
301  LEFT JOIN ax_anschrift a
302    ON a.gml_id = ANY (p.hat)
303
304  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen:
305  -- Noch mal "GB -> NamNum", aber dieses Mal fÃŒr "Rechtsgemeinschaft".
306  -- Kommt max. 1 mal je GB vor und hat keine Relation auf Person.
307  LEFT JOIN
308   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft
309       FROM ax_namensnummer r
310       JOIN ax_buchungsblatt gr
311         ON r.istbestandteilvon = gr.gml_id  -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
312      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
313   ON rg.gml_id = gb.gml_id  -- zum GB
314
315  WHERE f.endet IS NULL AND s.endet IS NULL and gb.endet IS NULL and nn.endet IS NULL AND p.endet IS NULL
316
317  ORDER BY f.flurstueckskennzeichen,
318           gb.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, s.laufendenummer,
319           nn.laufendenummernachdin1421;
320
321COMMENT ON VIEW exp_csv_str
322 IS 'View fÃŒr einen CSV-Export aus der Buchauskunft mit alkisexport.php. Liefert nur FlurstÃŒcke, die eine Lagebezeichnung MIT/OHNE Hausnummer haben. Dazu noch den Filter auf GML-ID der Straßentabelle setzen.';
323
324-- Test: SELECT * FROM exp_csv_str WHERE stgml = 'DENW15AL100000Q8'; -- Veilchenstraße in Löhne
325
326
327-- Analyse: Kann es mehr als 1 "Rechtsgemeinschaft" zu einem GB-Blatt geben?
328-- (Diese Frage stellte sich beim Design des View "exp_csv".)
329
330-- In umgekehrter Reihenfolge löschen (AbhÀngigkeiten).
331DROP VIEW IF EXISTS rechtsgemeinschaften_mehrfachzeilen;
332DROP VIEW IF EXISTS rechtsgemeinschaften_zaehlen;
333DROP VIEW IF EXISTS rechtsgemeinschaften_zum_grundbuch;
334
335-- Schritt 1: alle vorhandenen Rechtsgemeinschaften
336
337CREATE OR REPLACE VIEW rechtsgemeinschaften_zum_grundbuch
338AS
339 SELECT
340     gb.gml_id AS gb_gml,
341     gb.bezirk,
342     gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
343     nn.gml_id AS nn_gml, nn.beginnt, nn.laufendenummernachdin1421,
344     nn.artderrechtsgemeinschaft AS adr,
345     nn.beschriebderrechtsgemeinschaft
346  FROM ax_buchungsblatt gb
347  JOIN ax_namensnummer  nn  ON gb.gml_id = nn.istbestandteilvon
348  WHERE NOT nn.artderrechtsgemeinschaft IS NULL
349    AND gb.endet IS NULL AND nn.endet IS NULL -- Historie weglassen
350  ORDER BY gb.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, nn.laufendenummernachdin1421;
351
352COMMENT ON VIEW rechtsgemeinschaften_zum_grundbuch
353 IS 'Rechtsgemeinschaften zum Grundbuchblatt.';
354
355-- Schritt 2: Wo gibt es mehrere zu einem GB-Blatt
356
357CREATE OR REPLACE VIEW rechtsgemeinschaften_zaehlen
358AS
359 SELECT gb_gml, bezirk, gb_blatt, count(adr) AS anzahl
360   FROM rechtsgemeinschaften_zum_grundbuch
361   GROUP BY gb_gml, bezirk, gb_blatt
362   HAVING count(adr) > 1
363   ORDER BY bezirk, gb_blatt;
364
365COMMENT ON VIEW rechtsgemeinschaften_zaehlen
366 IS 'Rechtsgemeinschaften zum Grundbuchblatt zÀhlen. Nur Anzeigen, wenn es mehrere gibt.';
367-- Ergebnis: Ja, kann es geben
368
369-- Schritt 3: alle vorhandenen Zeilen anzeigen zu den GB-BlÀttern, bei denen es mehrere gibt.
370CREATE OR REPLACE VIEW rechtsgemeinschaften_mehrfachzeilen
371AS
372 SELECT *
373   FROM rechtsgemeinschaften_zum_grundbuch
374  WHERE gb_gml IN (SELECT gb_gml FROM rechtsgemeinschaften_zaehlen);
375
376COMMENT ON VIEW rechtsgemeinschaften_mehrfachzeilen
377 IS 'GrundbuchblÀtter mit mehr als einer Zeile Rechtsgemeinschaft.';
378
379-- Fazit:
380-- Man findet einige wenige identische oder Àhnlich aussehende Zeilen zu einem Grundbuch.
381-- Das sieht also eher nach einem PostNAS-FortfÌhrungsproblem aus, als nach unabhÀngigen Zeilen.
382-- Wurde hier eine Relation nicht sauber gelöscht?
383
384-- Welche Karten-Typen ?
385CREATE OR REPLACE VIEW kartentypen_der_texte_fuer_hnr
386AS
387   SELECT DISTINCT advstandardmodell
388   FROM ap_pto p
389   WHERE p.art = 'HNR';
390
391COMMENT ON VIEW kartentypen_der_texte_fuer_hnr
392  IS 'Datenanalyse: Kartentypen in Tabelle ap_pto fÃŒr Hausnummern.';
393
394-- Dies liefert:
395--  "{DKKM1000}"
396--  "{DKKM1000,DKKM500}"
397--  "{DKKM500}"
398--  NULL
399
400-- Texte, die NICHT dargestellt werden sollen.
401-- -------------------------------------------
402-- Texte und Text-Fragmente aus der Konvertierung ALK+ALB, die noch nicht gelöscht worden sind.
403CREATE OR REPLACE VIEW ap_pto_muell
404AS
405  SELECT p.ogc_fid,
406         p.schriftinhalt,
407         p.art,
408         p.drehwinkel * 57.296 AS winkel, -- * 180 / Pi
409         p.wkb_geometry
410    FROM ap_pto p
411   WHERE not p.schriftinhalt IS NULL
412     AND p.endet IS NULL
413     AND p.art IN ('AOG_AUG','PNR');
414
415COMMENT ON VIEW ap_pto_muell
416 IS 'Datenanalyse: Beschriftungen aus "ap_pto", die NICHT dargestellt werden sollen.';
417
418
419-- FlurstÃŒcke mit Anzeige der FlurstÃŒcksnummer an der "Standardposition"
420
421-- Nach der Konvertierung aus ALK hat zunÀchst jedes FlurstÌck eine explizit gesetzte Position der FlurstÌcksnummer.
422
423-- Nach einer manuellen Teilung bekommen die neuen FlurstÃŒcke im ALKIS nur dann eine Position,
424-- wenn die Positioin manuell bestimmt (verschoben) wurde.
425-- Wenn die FlurstÃŒcksnummer an ihrer "Standardposition" angezeigt werden soll,
426-- dann wird diese in den Daten (DHK, NAS) nicht gesetzt.
427-- Der Konverter PostNAS konvertiert aber nur die Daten, die er bekommt, er setzt nicht die Standard-Position
428-- fÃŒr die FlurstÃŒcke, die ohne eine manuelle Position kommen.
429
430-- Diese FÀlle identifizieren und unterscheiden:
431
432CREATE OR REPLACE VIEW flstnr_mit_manueller_position
433AS
434 SELECT f.gml_id,
435        f.gemarkungsnummer || '-' || f.flurnummer || '-' || f.zaehler::text || COALESCE ('/' || f.nenner::text, '') AS such -- Suchstring fÃŒr ALKIS-Navigation nach FS-Kennzeichen
436   FROM ax_flurstueck f
437   JOIN ap_pto p ON f.gml_id = ANY( p.dientzurdarstellungvon)
438  WHERE f.endet IS NULL;
439-- TIPP: mit zusÀtzlichem LIMIT auftrufen!
440
441COMMENT ON VIEW flstnr_mit_manueller_position
442  IS 'Sicht fÃŒr Datenanalyse: FlurstÃŒcke MIT manuell gesetzter Position fÃŒr die PrÀsentation der FS-Nr';
443
444CREATE OR REPLACE VIEW flstnr_ohne_manuelle_position
445AS
446 SELECT f.gml_id,
447        f.gemarkungsnummer || '-' || f.flurnummer || '-' || f.zaehler::text || COALESCE ('/' || f.nenner::text, '') AS such -- Suchstring fÃŒr ALKIS-Navigation nach FS-Kennzeichen
448 FROM   ax_flurstueck f
449   LEFT JOIN ap_pto p ON f.gml_id = ANY( p.dientzurdarstellungvon)
450  WHERE p.gml_id IS NULL
451    AND f.endet IS NULL;
452-- TIPP: mit zusÀtzlichem LIMIT auftrufen!
453
454COMMENT ON VIEW flstnr_ohne_manuelle_position
455  IS 'Sicht fÃŒr Datenanalyse: FlurstÃŒcke OHNE manuell gesetzte Position fÃŒr die PrÀsentation der FS-Nr';
456
457
458-- Umbruch im Label? z.B. "Schwimm-/nbecken"
459-- Sind 2 Buchstaben in Mapfile bei "WRAP" möglich?
460CREATE OR REPLACE VIEW texte_mit_umbruch
461AS
462 SELECT ogc_fid, schriftinhalt, art
463   FROM ap_pto
464  WHERE NOT schriftinhalt IS NULL AND schriftinhalt LIKE '%/n%';
465
466COMMENT ON VIEW texte_mit_umbruch
467 IS 'Sicht fÃŒr Datenanalyse: Vorkommen eines Umbruchs im Label-Text.';
468
469-- EXTENT fÃŒr das Mapfile eines Mandanten ermitteln
470CREATE OR REPLACE VIEW flurstuecks_minmax AS
471 SELECT min(st_xmin(wkb_geometry)) AS r_min,
472        min(st_ymin(wkb_geometry)) AS h_min,
473        max(st_xmax(wkb_geometry)) AS r_max,
474        max(st_ymax(wkb_geometry)) AS h_max
475   FROM ax_flurstueck f
476   WHERE f.endet IS NULL;
477
478COMMENT ON VIEW flurstuecks_minmax
479 IS 'Sicht fÃŒr Datenanalyse: Maximale Ausdehnung von ax_flurstueck fuer EXTENT-Angabe im Mapfile.';
480
481-- Nach Laden der Keytables:
482CREATE OR REPLACE VIEW baurecht
483AS
484  SELECT r.ogc_fid,
485         r.wkb_geometry,
486         r.gml_id,
487         r.artderfestlegung AS adfkey, -- Art der Festlegung - Key
488         r."name",                     -- Eigenname des Gebietes
489         r.stelle,                     -- Stelle Key
490         r.bezeichnung AS rechtbez,    -- Verfahrensnummer
491         a.bezeichner  AS adfbez,      -- Art der Festlegung - Bezeichnung
492         d.bezeichnung AS stellbez     -- Stelle Bezeichnung
493      -- , d.stellenart                -- weiter entschluesseln?
494    FROM ax_bauraumoderbodenordnungsrecht r
495    LEFT JOIN ax_bauraumoderbodenordnungsrecht_artderfestlegung a
496      ON r.artderfestlegung = a.wert
497    LEFT JOIN ax_dienststelle d
498      ON r.land   = d.land  AND r.stelle = d.stelle
499  WHERE r.endet IS NULL AND d.endet IS NULL ;
500
501COMMENT ON VIEW baurecht
502 IS 'Datenanalyse: EnstschlÃŒsselte Felder zu einer FlÀche des Baurechts.';
503
504-- Man glaubt es kaum, aber im ALKIS haben Gemeinde und Gemarkung keinerlei Beziehung miteinander
505-- Nur durch Auswertung der FlurstÃŒcke kann man ermitteln, in welcher Gemeinde eine Gemarkung liegt.
506CREATE OR REPLACE VIEW gemarkung_in_gemeinde
507AS
508  SELECT DISTINCT land, regierungsbezirk, kreis, gemeinde, gemarkungsnummer
509  FROM            ax_flurstueck
510  WHERE           endet IS NULL
511  ORDER BY        land, regierungsbezirk, kreis, gemeinde, gemarkungsnummer;
512
513COMMENT ON VIEW gemarkung_in_gemeinde
514 IS 'Welche Gemarkung liegt in welcher Gemeinde? Durch Verweise aus FlurstÃŒcken ermitteln.';
515
516
517-- Untersuchen, welche Geometrie-Typen vorkommen
518CREATE OR REPLACE VIEW arten_von_flurstuecksgeometrie
519AS
520 SELECT   count(gml_id) as anzahl,
521          st_geometrytype(wkb_geometry)
522 FROM     ax_flurstueck
523 WHERE    endet IS NULL
524 GROUP BY st_geometrytype(wkb_geometry);
525
526COMMENT ON VIEW arten_von_flurstuecksgeometrie IS 'Datenanalyse: vorkommende Geometry-Typen in Tabelle ax_flurstueck.';
527
528
529-- A d r e s s e n
530
531-- Verschluesselte Lagebezeichnung (Strasse und Hausnummer) fÃŒr eine Gemeinde
532-- SchlÃŒssel der Gemeinde im Filter (WHERE) nach Bedarf anpassen!
533CREATE OR REPLACE VIEW adressen_hausnummern
534AS
535    SELECT
536        s.bezeichnung AS strassenname,
537        g.bezeichnung AS gemeindename,
538        l.land, l.regierungsbezirk, l.kreis, l.gemeinde,
539        l.lage        AS strassenschluessel, l.hausnummer
540    FROM ax_lagebezeichnungmithausnummer l 
541    JOIN ax_gemeinde g
542      ON l.kreis=g.kreis AND l.gemeinde=g.gemeinde
543    JOIN ax_lagebezeichnungkatalogeintrag s
544      ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage = s.lage
545    WHERE l.gemeinde = '40';  -- '40' = Stadt Lage
546
547COMMENT ON VIEW adressen_hausnummern IS 'Datenanalyse: VerschlÃŒsselte Lagebezeichnung (Straße und Hausnummer) fÃŒr eine Gemeinde. SchlÃŒssel der Gemeinde nach Bedarf anpassen.';
548
549-- Zuordnung Adressen zu Flurstuecken
550-- Schluessel der Gemeinde nach Bedarf anpassen!
551CREATE OR REPLACE VIEW adressen_zum_flurstueck
552AS
553    SELECT
554           f.gemarkungsnummer,
555           f.flurnummer,
556           f.zaehler,
557           f.nenner,
558           g.bezeichnung AS gemeindename,
559           s.bezeichnung AS strassenname,
560           l.lage        AS strassenschluessel,
561           l.hausnummer
562      FROM   ax_flurstueck f
563      JOIN   ax_lagebezeichnungmithausnummer l   ON  l.gml_id = ANY (f.weistauf)
564      JOIN   ax_gemeinde g   ON l.kreis=g.kreis  AND l.gemeinde=g.gemeinde
565      JOIN   ax_lagebezeichnungkatalogeintrag s  ON  l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage = s.lage
566 --  WHERE l.gemeinde = '40'  -- ggf. Anpassen
567     ORDER BY f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner;
568
569COMMENT ON VIEW adressen_zum_flurstueck IS 'Datenanalyse: Zuordnung von Adressen zu Flurstuecken. SchlÃŒssel der Gemeinde nach Bedarf anpassen.';
570
571-- Punktförmige  P r À s e n t a t i o n s o b j e k t e  (ap_pto)
572-- Ermittlung der vorkommenden Arten
573CREATE OR REPLACE VIEW beschriftung_was_kommt_vor
574AS
575  SELECT DISTINCT art, horizontaleausrichtung, vertikaleausrichtung
576    FROM ap_pto
577   WHERE not schriftinhalt is null
578   ORDER BY art;
579
580COMMENT ON VIEW beschriftung_was_kommt_vor IS 'Analyse der vorkommenden Kombinationen in ap_pto (Beschriftung)';
581
582-- FlurstÃŒcke eines EigentÃŒmers
583-- ----------------------------
584
585-- Dieser View liefert nur die (einfache) Buchungsart "GrundstÃŒck"
586-- Solche FÀlle wie "Erbbaurecht an GrundstÌck" oder "Wohnungs-/Teileigentum an aufgeteiltes GrundstÌck"
587-- oder "Miteigentum an aufgeteiltes GrundstÃŒck" fehlen in dieser Auswertung.
588-- Dazu siehe: "rechte_eines_eigentuemers".
589
590-- Das Ergebnis ist gedacht fÃŒr den Export als CSV und Weiterverarbeitung mit einer Tabellenkalkulation
591-- oder einer einfachen Datenbank.
592
593-- Auch ein Export als Shape ist moeglich (dafÃŒr: geom hinzugefÃŒgt, Feldnamen gekÃŒrzt)
594-- Kommando:
595--  pgsql2shp -h localhost -p 5432 -f "/data/.../alkis_fs_gemeinde.shp"  [db-name]  public.flurstuecke_eines_eigentuemers
596
597-- Übersicht der Tabellen:
598--
599-- Person <benennt< NamNum. >istBestandteilVon> Blatt <istBestandteilVon< Stelle >istGebucht> Flurstueck
600--                                              *-> Bezirk                *-> Buchungsart     *-> Gemarkung
601
602CREATE OR REPLACE VIEW flurstuecke_eines_eigentuemers
603AS
604   SELECT
605      k.bezeichnung                AS gemarkung,
606      k.gemarkungsnummer           AS gemkg_nr,
607      f.flurnummer                 AS flur,
608      f.zaehler                    AS fs_zaehler,
609      f.nenner                     AS fs_nenner,
610      f.amtlicheflaeche            AS flaeche,
611      f.wkb_geometry               AS geom,  -- fuer Export als Shape
612   -- g.bezirk,
613      b.bezeichnung                AS bezirkname,
614      g.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
615      g.blattart,
616      s.laufendenummer             AS bvnr,
617      art.bezeichner               AS buchgsart,
618   -- s.zaehler || '/' || s.nenner AS buchg_anteil,
619      n.laufendenummernachdin1421  AS name_num,
620   -- n.zaehler || '/' || n.nenner AS nam_anteil,
621      p.nachnameoderfirma          AS nachname --,
622   -- p.vorname
623   FROM   ax_person              p
624     JOIN ax_namensnummer        n   -- Namennummer >benennt> Person
625       ON p.gml_id = n.benennt
626     JOIN ax_buchungsblatt       g   -- Namensnummer >istBestandteilVon> Grundbuch
627       ON n.istbestandteilvon = g.gml_id
628     JOIN ax_buchungsblattbezirk b    ON g.land = b.land AND g.bezirk = b.bezirk
629     JOIN ax_buchungsstelle      s   -- Buchungs-Stelle >istBestandteilVon> Grundbuch
630       ON s.istbestandteilvon = g.gml_id
631     JOIN ax_buchungsstelle_buchungsart art
632       ON s.buchungsart = art.wert
633     JOIN ax_flurstueck          f  -- Flurstueck >istGebucht> Buchungs-Stelle
634       ON f.istgebucht = s.gml_id
635     JOIN ax_gemarkung           k   
636       ON f.land = k.land AND f.gemarkungsnummer = k.gemarkungsnummer
637   WHERE p.nachnameoderfirma LIKE 'Stadt %'   -- ** Bei Bedarf anpassen!
638     AND p.endet IS NULL AND n.endet IS NULL AND g.endet IS NULL AND b.endet IS NULL
639     AND s.endet IS NULL AND f.endet IS NULL AND k.endet IS NULL
640   ORDER BY k.bezeichnung, f.flurnummer, f.zaehler, f.nenner, g.bezirk, g.buchungsblattnummermitbuchstabenerweiterung, s.laufendenummer;
641
642COMMENT ON VIEW flurstuecke_eines_eigentuemers
643  IS 'Nur einfache Buchungsart "GrundstÃŒck". Muster fÃŒr Export: Suchkriterium nach Bedarf anpassen.';
644
645
646-- Rechte eines EigentÃŒmers
647-- ------------------------
648-- Dieser View sucht speziell die FÀlle wo eine Buchungsstelle ein Recht "an" einer anderen Buchungsstelle hat.
649--  - "Erbbaurecht *an* GrundstÃŒck"
650--  - "Wohnungs-/Teileigentum *an* Aufgeteiltes GrundstÃŒck"
651--  - "Miteigentum *an* Aufteteiltes GrundstÃŒck"
652-- Suchkriterium ist der Name des EigentÃŒmers auf dem "herrschenden" Grundbuch, also dem Besitzer des Rechtes.
653
654-- Diese FÀlle fehlen im View "flurstuecke_eines_eigentuemers".
655
656-- Übersicht der Tabellen:
657-- Person <benennt< NamNum. >istBestandteilVon> Blatt <istBestandteilVon< Stelle-h >an> Stelle-d >istGebucht> Flurstueck
658-- Wobei ">xxx>" = JOIN ÃŒber die Verbindungs-Tabelle "alkis_beziehungen" mit der Beziehungsart "xxx".
659
660-- DROP VIEW rechte_eines_eigentuemers;
661CREATE OR REPLACE VIEW rechte_eines_eigentuemers
662AS
663   SELECT
664      k.bezeichnung                AS gemarkung,
665      k.gemarkungsnummer           AS gemkg_nr,
666      f.flurnummer                 AS flur,
667      f.zaehler                    AS fs_zaehler,
668      f.nenner                     AS fs_nenner,
669      f.amtlicheflaeche            AS flaeche,
670      f.wkb_geometry               AS geom,  -- fuer Export als Shape
671   -- g.bezirk,
672      b.bezeichnung                AS bezirkname,
673      g.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
674   -- g.blattart,
675      sh.laufendenummer            AS bvnr_herr,
676      sh.zaehler || '/' || sh.nenner AS buchg_anteil_herr,
677      arth.bezeichner              AS buchgsa_herr,
678      artd.bezeichner              AS buchgsa_dien,
679      sd.laufendenummer            AS bvnr_dien,
680   -- sd.zaehler || '/' || sd.nenner AS buchg_anteil_dien,
681      n.laufendenummernachdin1421  AS name_num,
682   -- n.zaehler || '/' || n.nenner AS nam_anteil,
683      p.nachnameoderfirma          AS nachname --, 
684   -- p.vorname
685   FROM   ax_person              p
686     JOIN ax_namensnummer        n    -- Namennummer >benennt> Person
687       ON p.gml_id = n.benennt
688     JOIN ax_buchungsblatt       g    -- Namensnummer >istBestandteilVon> Grundbuch
689       ON n.istBestandteilVon = g.gml_id
690     JOIN ax_buchungsblattbezirk b   
691       ON g.land = b.land AND g.bezirk = b.bezirk
692     JOIN ax_buchungsstelle      sh  -- B-Stelle herr >istBestandteilVon> Grundbuch
693       ON sh.istbestandteilvon = g.gml_id  -- herrschende Buchung
694     JOIN ax_buchungsstelle_buchungsart arth
695       ON sh.buchungsart = arth.wert
696     JOIN ax_buchungsstelle      sd   -- B-Stelle herr.  >an/zu> B-Stelle dien.
697       ON (sd.gml_id =ANY(sh.an) OR sd.gml_id = ANY(sh.zu) )
698     JOIN ax_buchungsstelle_buchungsart artd
699       ON sd.buchungsart = artd.wert
700     JOIN ax_flurstueck          f    -- Flurstueck  >istGebucht> B-Stelle dien     
701       ON f.istgebucht = sd.gml_id
702     JOIN ax_gemarkung           k   
703       ON f.land = k.land AND f.gemarkungsnummer = k.gemarkungsnummer
704   WHERE p.nachnameoderfirma LIKE 'Stadt %'   -- ** Bei Bedarf anpassen!   
705     AND p.endet IS NULL AND n.endet IS NULL AND g.endet IS NULL AND b.endet IS NULL
706     AND sh.endet IS NULL AND sd.endet IS NULL AND f.endet IS NULL AND k.endet IS NULL
707   ORDER BY k.bezeichnung, f.flurnummer, f.zaehler, f.nenner, g.bezirk, g.buchungsblattnummermitbuchstabenerweiterung, sh.laufendenummer;
708
709COMMENT ON VIEW rechte_eines_eigentuemers IS 'Muster fÌr Export: Suchkriteriumnach Bedarf anpassen. Dies ergÀnzt "flurstuecke_eines_eigentuemers" um die FÀlle mit besonderen Buchungen.';
710
711
712-- Suche nach Fehler durch "Replace"
713-- Eine Hausnummer darf nur einem Gebaeude zugeordnet werden.
714-- Das verschieben der Relation
715--   ax_gebaeude   >von>zeigtAuf>zu>  ax_lagebezeichnungmithausnummer
716-- fuehrt möglicherweise dazu, dass die alte Relation nicht gelöscht wird.
717-- Die angezeigten FÀlle sind potentielle Fehler.
718
719CREATE OR REPLACE VIEW fehler_hausnummer_mehrfach_verwendet
720AS
721 SELECT l.gml_id, l.gemeinde, l.lage, l.hausnummer
722   FROM ax_gebaeude g
723   JOIN ax_lagebezeichnungmithausnummer l 
724     ON l.gml_id = ANY(g.zeigtauf)
725  GROUP BY l.gml_id, l.gemeinde, l.lage, l.hausnummer
726  HAVING count(g.gml_id) > 1;
727
728COMMENT ON VIEW fehler_hausnummer_mehrfach_verwendet
729 IS 'Fehlersuche: Nach replace von ax_lagebezeichnungmithausnummer mit einem neuen ax_gebaeude bleibt die alte Verbindung?';
730
731-- Ein GebÀude hat mehrere Nummern.
732CREATE OR REPLACE VIEW adressen_zu_gebauede_mit_mehreren_hausnummern
733AS
734 SELECT g1.gml_id, l1.gemeinde, l1.lage, l1.hausnummer -- Anzeige der Adressfelder
735   FROM ax_gebaeude g1
736   JOIN ax_lagebezeichnungmithausnummer l1 ON l1.gml_id = ANY(g1.zeigtauf)
737  WHERE g1.gml_id IN -- Subquery sucht GebÀude mit meherern Hausnummen
738   (SELECT g2.gml_id
739      FROM ax_gebaeude g2
740      JOIN ax_lagebezeichnungmithausnummer l2 ON l2.gml_id = ANY(g2.zeigtauf)
741     GROUP BY g2.gml_id
742   HAVING count(l2.gml_id) > 1)
743   ORDER BY l1.gemeinde, l1.lage, l1.hausnummer;
744
745COMMENT ON VIEW adressen_zu_gebauede_mit_mehreren_hausnummern
746 IS 'GebÀude mit mehreren Hausnummern suchen (ist erlaubt) und dazu die Adressen anzeigen.';
747
748
749-- Analyse der Buchungs-Arten im Bestand
750CREATE OR REPLACE VIEW buchungsarten_vorkommend
751AS
752  SELECT a.wert, a.bezeichner,
753         count(b.gml_id) AS anzahl_buchungen
754    FROM ax_buchungsstelle_buchungsart a
755    JOIN ax_buchungsstelle b  ON a.wert = b.buchungsart
756GROUP BY a.wert, a.bezeichner
757ORDER BY a.wert, a.bezeichner;
758
759COMMENT ON VIEW buchungsarten_vorkommend
760 IS 'Welche Arten von Buchungsart kommen in dieser Datenbank tÀtsÀchlich vor?.';
761
762
763-- Analyse: FÀlle mit Erbbaurecht
764-- Benutzt den Baustein-View "doppelverbindung"
765
766--   +++ BESSER: analog doppelverbindung direkt codieren
767
768CREATE OR REPLACE VIEW erbbaurechte_suchen
769AS
770  SELECT f.gml_id, f.gemarkungsnummer || '-' || f.flurnummer || '-' || f.zaehler AS fssuch, f.nenner
771   FROM ax_flurstueck    f
772   JOIN doppelverbindung d     -- beide FÀlle ÃŒber Union-View: direkt und ÃŒber Recht von BS an BS
773     ON d.fsgml = f.gml_id
774
775
776
777   JOIN ax_buchungsstelle s    -- Buchungs-Stelle
778     ON d.bsgml = s.gml_id
779   WHERE s.buchungsart = 2101;
780
781
782
783
784COMMENT ON VIEW erbbaurechte_suchen
785 IS 'Suche nach FÀllen mit Buchungsrt 2101=Erbbaurecht';
786
787
788-- Suchen von Gewannenbezeichnungen, die auch als Straßenname verwendet werden.
789-- Diese FÀlle fÃŒhren möglicherweise zu unvollstÀndiger Ausgabe beim Export "alle FlurstÃŒcke an einer Straße"
790-- weil nur Lagebezeichnung MIT und OHNE Hausnummer gesucht wird, aber keine gleich lautende Gewanne.
791
792-- DROP VIEW strasse_als_gewanne;
793CREATE OR REPLACE VIEW strasse_als_gewanne
794AS
795  SELECT k.gemeinde, k.lage AS strassenschluessel,
796         o.unverschluesselt AS gewanne_und_strasse, -- = k.bezeichnung = Straßenname
797         count(f.gml_id) AS anzahl_fs_gewanne
798  FROM ax_lagebezeichnungkatalogeintrag k   -- Straßentabelle
799  JOIN ax_lagebezeichnungohnehausnummer o   -- Gewanne
800    ON k.bezeichnung = o.unverschluesselt   -- Gleiche Namen
801  -- Join Gewanne auf FlurstÃŒcke um nur solche FÀlle anzuzeigen, die hier verwendet werden.
802  -- UND die auch in der gleichen Gemeinde liegen.
803  -- Sonst könnte zufÀllige Namensgleichheiten aus verschiedenen Gemeinden geben.
804  JOIN ax_flurstueck f               --  Flurst. >zeigtAuf>  Lage
805    ON o.gml_id = ANY(f.zeigtauf) 
806 WHERE f.gemeinde = k.gemeinde  -- Gewanne wird fÃŒr ein Flst. in gleicher Gemeinde verwendet, wie der StraßenschlÃŒssel
807  GROUP BY k.gemeinde, k.lage, o.unverschluesselt
808  ORDER BY k.gemeinde, k.lage, o.unverschluesselt;
809
810COMMENT ON VIEW strasse_als_gewanne
811 IS 'Gewannenbezeichnungen, die auch als Straßenname verwendet werden. Mit FlurstÃŒcks-ZÀhler.';
812
813
814-- Wie zuvor, aber die FlurstÌcke werden hier nicht nur gezÀhlt sondern auch aufgelistet.
815-- das Format des FlusrtÃŒckskennzeichens kann in die Mapbender-Navigation eingegeben werden.
816
817CREATE OR REPLACE VIEW strasse_als_gewanne_flst
818AS
819  SELECT fo.gemarkungsnummer || '-' || fo.flurnummer || '-' || fo.zaehler::text || COALESCE ('/' || fo.nenner::text, '') AS flstkennz,
820         k.gemeinde,
821         o.unverschluesselt AS gewanne,
822         k.lage        -- AS strassen_schluessel
823  FROM ax_lagebezeichnungkatalogeintrag k   -- Straßentabelle
824  JOIN ax_lagebezeichnungohnehausnummer o   -- Gewanne
825    ON k.bezeichnung = o.unverschluesselt   -- Gleiche Namen
826   JOIN ax_flurstueck fo                    --  Flurst. >zeigtAuf>  Lage
827    ON o.gml_id = ANY(fo.zeigtauf) 
828 WHERE fo.gemeinde = k.gemeinde  -- Gewanne wird fÃŒr ein Flst. in gleicher Gemeinde verwendet, wie der StraßenschlÃŒssel
829  ORDER BY fo.gemarkungsnummer, fo.flurnummer, fo.zaehler, k.gemeinde, k.bezeichnung;
830
831COMMENT ON VIEW strasse_als_gewanne_flst
832 IS 'FlurstÃŒcke mit Gewannenbezeichnungen, die auch als Straßenname verwendet werden.';
833
834
835-- Suche nach Fehlern in den Daten, die moeglicherweise aus der Migration stammen und
836-- im Rahmen der Nachmigration noch korrigiert werden muessen.
837
838CREATE OR REPLACE VIEW nachmigration_aehnliche_anschriften
839AS
840  SELECT DISTINCT p.gml_id, p.nachnameoderfirma, p.vorname,
841         a1.ort_post, a1.strasse AS strasse1, a2.strasse AS strasse2, a1.hausnummer
842    FROM ax_person    p
843    JOIN ax_anschrift a1 ON a1.gml_id = ANY(p.hat)
844    JOIN ax_anschrift a2 ON a2.gml_id = ANY(p.hat)
845   WHERE a1.gml_id <> a2.gml_id
846      AND a1.ort_post =  a2.ort_post
847      AND a1.strasse like trim(a2.strasse, '.') || '%'
848      AND a1.hausnummer = a2.hausnummer
849      AND p.endet IS NULL AND a1.endet IS NULL and a2.endet IS NULL
850    ORDER BY p.nachnameoderfirma, p.vorname;
851
852COMMENT ON VIEW nachmigration_aehnliche_anschriften
853 IS 'Nachmigration? Zu einer Person gibt es mehrere Anschriften, die in Ort und Hausnummer identisch sind und beim Straßennemen entweder auch identisch sind oder eine AbkÃŒrzung mit Punkt enthalten.';
854
855
856-- Bevor alle inversen Relationen im Schema auskommentiert werden,
857-- noch mal in die Datenbank schauen, ob nicht doch eine davon gefÃŒllt ist.
858-- Nach dem Entfernen dieser Spalten wird der View nicht mehr funktionieren
859-- und wird darum ebenfalls auskommentiert.
860
861/*
862CREATE OR REPLACE VIEW nicht_gefuellte_inverse_relationen_spalten
863AS
864  SELECT 'ax_flurstueck' AS tabelle, 'beziehtsichaufflurstueck' AS spalte,
865     count(gml_id) AS anzahl_eintraege
866  FROM ax_flurstueck WHERE NOT beziehtsichaufflurstueck IS NULL
867UNION
868  SELECT 'ax_flurstueck' AS tabelle, 'gehoertanteiligzu' AS spalte,
869     count(gml_id) AS anzahl_eintraege
870  FROM ax_flurstueck WHERE NOT gehoertanteiligzu IS NULL
871UNION
872  SELECT 'ax_lagebezeichnungohnehausnummer' AS tabelle, 'beschreibt' AS spalte,
873     count(gml_id) AS anzahl_eintraege
874  FROM ax_lagebezeichnungohnehausnummer WHERE NOT beschreibt IS NULL
875UNION
876  SELECT 'ax_lagebezeichnungohnehausnummer' AS tabelle, 'gehoertzu' AS spalte,
877     count(gml_id) AS anzahl_eintraege
878  FROM ax_lagebezeichnungohnehausnummer WHERE NOT gehoertzu IS NULL
879UNION
880  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'hat' AS spalte,
881     count(gml_id) AS anzahl_eintraege
882  FROM ax_lagebezeichnungmithausnummer WHERE NOT hat IS NULL
883UNION
884  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'beziehtsichauf' AS spalte,
885     count(gml_id) AS anzahl_eintraege
886  FROM ax_lagebezeichnungmithausnummer WHERE NOT beziehtsichauf IS NULL
887UNION
888  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'beziehtsichauchauf' AS spalte,
889     count(gml_id) AS anzahl_eintraege
890  FROM ax_lagebezeichnungmithausnummer WHERE NOT beziehtsichauchauf IS NULL
891UNION
892  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'gehoertzu' AS spalte,
893     count(gml_id) AS anzahl_eintraege
894  FROM ax_lagebezeichnungmithausnummer WHERE NOT gehoertzu IS NULL
895UNION
896  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'weistzum' AS spalte,
897     count(gml_id) AS anzahl_eintraege
898  FROM ax_lagebezeichnungmithausnummer WHERE NOT weistzum IS NULL
899UNION
900  SELECT 'ax_lagebezeichnungmitpseudonummer' AS tabelle, 'gehoertzu' AS spalte,
901     count(gml_id) AS anzahl_eintraege
902  FROM ax_lagebezeichnungmitpseudonummer WHERE NOT gehoertzu IS NULL
903--UNION
904--  -- ist gefÃŒllt!
905--  SELECT 'ax_georeferenziertegebaeudeadresse' AS tabelle, 'hatauch' AS spalte,
906--     count(gml_id) AS anzahl_eintraege
907--  FROM ax_georeferenziertegebaeudeadresse WHERE NOT hatauch IS NULL
908UNION
909  SELECT 'ax_sicherungspunkt' AS tabelle, 'beziehtsichauf' AS spalte,
910     count(gml_id) AS anzahl_eintraege
911  FROM ax_sicherungspunkt WHERE NOT beziehtsichauf IS NULL
912UNION
913  SELECT 'ax_sicherungspunkt' AS tabelle, 'gehoertzu' AS spalte,
914     count(gml_id) AS anzahl_eintraege
915  FROM ax_sicherungspunkt WHERE NOT gehoertzu IS NULL
916-- Punktort: ist gefÃŒllt (nicht invers)
917--UNION
918--  SELECT 'ax_punktortag' AS tabelle, 'istteilvon' AS spalte,
919--     count(gml_id) AS anzahl_eintraege
920--  FROM ax_punktortag WHERE NOT istteilvon IS NULL
921--UNION
922--  SELECT 'ax_punktortau' AS tabelle, 'istteilvon' AS spalte,
923--     count(gml_id) AS anzahl_eintraege
924--  FROM ax_punktortau WHERE NOT istteilvon IS NULL
925--UNION
926--  SELECT 'ax_punktortta' AS tabelle, 'istteilvon' AS spalte,
927--     count(gml_id) AS anzahl_eintraege
928--  FROM ax_punktortta WHERE NOT istteilvon IS NULL
929UNION
930  SELECT 'ax_person' AS tabelle, 'weistauf' AS spalte,
931     count(gml_id) AS anzahl_eintraege
932  FROM ax_person WHERE NOT weistauf IS NULL
933UNION
934  SELECT 'ax_person' AS tabelle, 'uebtaus' AS spalte,
935     count(gml_id) AS anzahl_eintraege
936  FROM ax_person WHERE NOT uebtaus IS NULL
937UNION
938  SELECT 'ax_person' AS tabelle, 'besitzt' AS spalte,
939     count(gml_id) AS anzahl_eintraege
940  FROM ax_person WHERE NOT besitzt IS NULL
941UNION
942  SELECT 'ax_person' AS tabelle, 'zeigtauf' AS spalte,
943     count(gml_id) AS anzahl_eintraege
944  FROM ax_person WHERE NOT zeigtauf IS NULL
945UNION
946  SELECT 'ax_person' AS tabelle, 'benennt' AS spalte,
947     count(gml_id) AS anzahl_eintraege
948  FROM ax_person WHERE NOT benennt IS NULL
949UNION
950  SELECT 'ax_anschrift' AS tabelle, 'beziehtsichauf' AS spalte,
951     count(gml_id) AS anzahl_eintraege
952  FROM ax_anschrift WHERE NOT beziehtsichauf IS NULL
953UNION
954  SELECT 'ax_anschrift' AS tabelle, 'gehoertzu' AS spalte,
955     count(gml_id) AS anzahl_eintraege
956  FROM ax_anschrift WHERE NOT gehoertzu IS NULL
957UNION
958  SELECT 'ax_verwaltung' AS tabelle, 'beziehtsichauf' AS spalte,
959     count(gml_id) AS anzahl_eintraege
960  FROM ax_verwaltung WHERE NOT beziehtsichauf IS NULL
961UNION
962  SELECT 'ax_vertretung' AS tabelle, 'vertritt' AS spalte,
963     count(gml_id) AS anzahl_eintraege
964  FROM ax_vertretung WHERE NOT vertritt IS NULL
965UNION
966  SELECT 'ax_buchungsblatt' AS tabelle, 'bestehtaus' AS spalte,
967     count(gml_id) AS anzahl_eintraege
968  FROM ax_buchungsblatt WHERE NOT bestehtaus IS NULL
969UNION
970  SELECT 'ax_buchungsstelle' AS tabelle, 'grundstueckbestehtaus' AS spalte,
971     count(gml_id) AS anzahl_eintraege
972  FROM ax_buchungsstelle WHERE NOT grundstueckbestehtaus IS NULL
973UNION
974  SELECT 'ax_gebaeude' AS tabelle, 'haengtzusammenmit' AS spalte,
975     count(gml_id) AS anzahl_eintraege
976  FROM ax_gebaeude WHERE NOT haengtzusammenmit IS NULL
977;
978
979COMMENT ON VIEW nicht_gefuellte_relationen_spalten
980 IS 'ÜberprÃŒfung auf nicht gefÃŒllte Inverse Relationen.
981Funktioniert nur, solange diese nicht entfernt wurden.';
982
983*/
984
985-- Daraus resultiert der folgende Patch fÃŒr bereits angelegte Datenbanken:
986/*
987        ALTER TABLE ax_flurstueck                    DROP COLUMN beziehtsichaufflurstueck;
988        ALTER TABLE ax_flurstueck                    DROP COLUMN gehoertanteiligzu;
989        ALTER TABLE ax_lagebezeichnungohnehausnummer DROP COLUMN beschreibt;
990        ALTER TABLE ax_lagebezeichnungohnehausnummer DROP COLUMN gehoertzu;
991        ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN hat;
992        ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN beziehtsichauf;
993        ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN beziehtsichauchauf;
994        ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN gehoertzu;
995        ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN weistzum;
996        ALTER TABLE ax_lagebezeichnungmitpseudonummer DROP COLUMN gehoertzu;
997        ALTER TABLE ax_sicherungspunkt               DROP COLUMN beziehtsichauf;
998        ALTER TABLE ax_sicherungspunkt               DROP COLUMN gehoertzu;
999        ALTER TABLE ax_person                        DROP COLUMN weistauf;
1000        ALTER TABLE ax_person                        DROP COLUMN uebtaus;
1001        ALTER TABLE ax_person                        DROP COLUMN besitzt;
1002        ALTER TABLE ax_person                        DROP COLUMN zeigtauf;
1003        ALTER TABLE ax_person                        DROP COLUMN benennt;
1004        ALTER TABLE ax_anschrift                     DROP COLUMN beziehtsichauf;
1005        ALTER TABLE ax_anschrift                     DROP COLUMN gehoertzu;
1006        ALTER TABLE ax_verwaltung                    DROP COLUMN beziehtsichauf;
1007        ALTER TABLE ax_vertretung                    DROP COLUMN vertritt;
1008        ALTER TABLE ax_buchungsblatt                 DROP COLUMN bestehtaus;
1009        ALTER TABLE ax_buchungsstelle                DROP COLUMN grundstueckbestehtaus;
1010        ALTER TABLE ax_gebaeude                      DROP COLUMN haengtzusammenmit;
1011*/
1012
1013
1014-- END --
Note: See TracBrowser for help on using the repository browser.