source: trunk/import/sichten.sql @ 336

Revision 336, 49.2 KB checked in by frank.jaeger, 10 years ago (diff)

Schema zurück auf 16stellige gml_id.
Überarbeiten Trigger-Funktion "delete_feature_hist()" - noch nicht ausgetestet.

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