source: trunk/import/sichten.sql @ 332

Revision 332, 48.5 KB checked in by frank.jaeger, 10 years ago (diff)

Zwischen-Stand vor Wochenende

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