source: trunk/import/norgis_alkis_pp/postcreate.de/views_exp_csv.sql @ 397

Revision 397, 36.7 KB checked in by frank.jaeger, 6 years ago (diff)

Views für CSV-Export aus Buchauskunft korrigiert: keine mehrfachen Zeilen wenn Personen mehrere Adressen haben.

Line 
1
2-- ===================================================================================
3--  ALKIS-PostGIS   Mapbender-Navigation und Buchauskunft fÃŒr NorGIS-ALKIS-Importer
4-- ===================================================================================
5
6-- Aufgabe:       Views bereit stellen fÃŒr den CSV-Export in der ALKIS-Buch-Auskunft.
7-- AusfÃŒhrung in: Step "postcreate.d" des ALKIS-Importers. Hier also nur Definitionen machen, keine Daten bearbeiten.
8
9--Stand
10--  2016-02-23
11--  2016-11-24 Index auf ax.person.nachnameoderfirma fÃŒr WMS Flurstuecke_kommunal
12--  2016-12-01 exp_csv: Fehlerkorrektur bei EntschlÃŒsselung der Buchungsart
13--             Optimierte Version (ohne Doppelverbindung)
14--  2017-02-23 Spalte "fall" aus View "flst_an_strasse" im View "exp_csv_str" ausgeben.
15--             Darauf basiert ein neuer Filter im Programm "alkisexport.php".
16--                      Sortierung FS-Kennz. repariert in Views "exp_csv" und "exp_csv_str"
17--  2017-10-10 Berechtigungen rausgenommen in getrennte Datei
18--  2017-12-06 Umbenennung von "x_classic2norgis.sql" nach "views_exp_csv.sql"
19--  2017-12-20 Beseitigung des Fehlers: Mehrere Adressen zur Person fuehren zu mehrfachen Zeilen (Wiederholung FlurstÃŒck und Flaeche ..)
20--             Es wird je Persoon nur noch die "letzte" Adresse verwendet (subquery).
21--             Der View "exp_csv_str" ist jetzt direkt als 4fach-UNION (2x2) codiert statt mit eingebettetem gespeicherten 2fach-Union.
22--             Hauptvorteil: Keine undurchsichtigen AbhÀngigkeiten. Ist auch etwas schneller.
23
24-- ToDo:
25--  - die alten Übersichten "pp_flur", "pp_gemarkung" und "pp_gemeinde" wieder erzeugen
26--    Siehe Script: "pp_gebiete.sql" (FÃŒllen) und Teile von "pp_definition.sql" (DB-Struktur).
27
28
29-- I n d i c e s
30-- ============================
31-- Tabelle "ax_gemarkungsteilflur" sollte Such-Index erhalten auf "gemarkung".
32-- FÃŒr Auflistung aller Fluren zur Gemarkung in Script "alkisnav_fls", Function "EineGemarkung".
33
34
35-- Der WMS "Flurstuecke Kommunal" (aus View "st_flurst[gkz][e|r]") wird langsam, wenn er in einer kreisweiten Datenbank ausgefÃŒhrt wird.
36-- Das Filter-Feld benötigt einen Index:
37DROP INDEX if exists ax_person_nname;
38CREATE INDEX ax_person_nname
39  ON ax_person USING btree (nachnameoderfirma COLLATE pg_catalog."default");
40
41
42-- V i e w s
43-- ============================
44
45-- Bausteine fÃŒr andere Views:
46-- ---------------------------
47-- Ein View, der die Verbindung von FlurstÃŒck zur Straßentabelle fÃŒr zwei verschiedene FÀlle herstellt.
48-- Einmal ÃŒber die Lagebezeichnung MIT Hausnummer und einmal OHNE.
49-- Dies kann als "MittelstÃŒck" in den anderen Views eingefÃŒgt werden.
50
51   DROP VIEW if exists public.flst_an_strasse; -- wird nicht mehr verwendet
52/*
53CREATE OR REPLACE VIEW public.flst_an_strasse
54AS
55  -- FlurstÃŒck >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
56  SELECT fm.gml_id AS fsgml,
57         sm.gml_id AS stgml,                 -- Filter: gml_id der Straße
58         'm' AS fall                         -- SÀtze unterschieden: Mit HsNr
59    FROM ax_flurstueck fm                    -- FlurstÃŒck Mit
60    JOIN ax_lagebezeichnungmithausnummer lm  -- Lage MIT
61      ON lm.gml_id = ANY (fm.weistauf)
62    JOIN ax_lagebezeichnungkatalogeintrag sm
63      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
64   WHERE lm.endet IS NULL AND fm.endet IS NULL -- nichts Historisches
65 UNION
66  -- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
67  SELECT fo.gml_id AS fsgml,
68         so.gml_id AS stgml,                 -- Filter: gml_id der Straße
69         'o' AS fall                         -- SÀtze unterschieden: Ohne HsNr
70    FROM ax_flurstueck fo                    -- FlurstÃŒck OHNE
71    JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
72      ON lo.gml_id = ANY (fo.zeigtauf)
73    JOIN ax_lagebezeichnungkatalogeintrag so -- Straße OHNE
74      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
75   WHERE lo.endet IS NULL AND fo.endet IS NULL; -- nichts Historisches
76
77COMMENT ON VIEW public.flst_an_strasse
78 IS 'ALKIS-Beziehung von FlurstÃŒck zu Straßentabelle. UNION-Zusammenfassung der FÀlle MIT und OHNE Hausnummer.';
79*/
80
81
82-- Generelle Export-Struktur "FlurstÃŒck - Buchung - Grundbuch - Person"
83-- --------------------------------------------------------------------
84-- Wird benötigt im Auskunft-Modul "alkisexport.php":
85-- Je nach aufrufendem Modul wird der Filter (WHERE) an anderer Stelle gesetzt (gml_id von FS, GB oder Pers.)
86-- FÃŒr Filter nach "Straße" siehe die nachfolgende Sonderversion "exp_csv_str".
87
88-- Problem / Konflikt:
89-- Es kann nur eine lineare Struktur aus Spalten und Zeilen exportiert werden.
90-- Wenn nicht nur die Daten des Ausgangs-Objektes exportiert werden, sondern auch verbundene Tabellen in
91-- einer 1:N-Struktur, dann verdoppeln sich Zeileninhalte und es werden redundante Daten erzeugt.
92-- Diese Redundanzen mÃŒssen vom dem Programm gefiltert werden, das die Daten ÃŒber eine Schnittstelle einliest.
93-- Anwendungs-Beispiel: Abrechnung von AnliegerbeitrÀgen.
94
95DROP VIEW IF EXISTS exp_csv;
96CREATE OR REPLACE VIEW exp_csv
97AS
98 SELECT -- Fall: einfache Buchung (ohne "Recht an")
99  -- F l u r s t ÃŒ c k
100    f.gml_id                             AS fsgml,       -- möglicher Filter FlurstÃŒcks-GML-ID
101    f.flurstueckskennzeichen             AS fs_kennz,
102    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
103    f.flurnummer, f.zaehler, f.nenner,
104    f.amtlicheflaeche                    AS fs_flae,
105    g.bezeichnung                        AS gemarkung,
106  -- G r u n d b u c h
107    gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
108    gb.bezirk                            AS gb_bezirk,
109    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
110    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
111  -- B u c h u n g s s t e l l e  (GrundstÃŒck)
112    s.laufendenummer                     AS bu_lfd,      -- BVNR
113    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
114    s.buchungsart,                                       -- verschlÃŒsselt
115    wb.v                                 AS bu_art,      -- Buchungsart entschlÃŒsselt
116  -- N a m e n s N u m m e r  (Normalfall mit Person)
117    nn.laufendenummernachdin1421         AS nam_lfd,
118    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
119  -- R e c h t s g e m e i n s c h a f t  (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
120    rg.artderrechtsgemeinschaft          AS nam_adr,
121    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
122    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
123  -- P e r s o n
124    p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
125    p.anrede,                                            -- Anrede key
126    wp.v                                 AS anrv,        -- Anrede Value zum Key
127    p.vorname,
128    p.namensbestandteil,
129    p.nachnameoderfirma,                                 -- Familienname
130    p.geburtsdatum,
131  -- A d r e s s e  der Person
132    a.postleitzahlpostzustellung         AS plz,
133    a.ort_post                           AS ort,         -- Anschreifenzeile 1: PLZ+Ort
134    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
135    a.bestimmungsland                    AS land
136   FROM ax_flurstueck    f               -- FlurstÃŒck
137  JOIN ax_gemarkung g                   -- entschlÃŒsseln
138    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
139  JOIN ax_buchungsstelle s              -- FS >istGebucht> Buchungstelle
140    ON f.istgebucht = s.gml_id
141  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
142    ON gb.gml_id = s.istbestandteilvon
143  JOIN ax_buchungsblattbezirk z
144    ON gb.land=z.land AND gb.bezirk=z.bezirk
145  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
146    ON gb.gml_id = nn.istbestandteilvon
147  JOIN ax_person p                      -- NamNum >benennt> Person
148    ON p.gml_id = nn.benennt
149  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
150    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.gml_id DESC LIMIT 1)
151  -- E n t s c h l ÃŒ s s e l n:
152  LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
153    ON cast(p.anrede AS character varying) = wp.k
154   AND wp.element = 'ax_person'
155   AND wp.bezeichnung = 'anrede'
156  LEFT JOIN alkis_wertearten wb         -- EntschlÃŒsseln "Buchungsart"
157    ON cast(s.buchungsart AS character varying) = wb.k
158 -- buchungsart = integer / .k  = char 4stellig
159   AND wb.element = 'ax_buchungsstelle'
160   AND wb.bezeichnung = 'buchungsart'
161  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen:
162  -- Noch mal "GB -> NamNum", aber dieses Mal fÃŒr "Rechtsgemeinschaft".
163  -- Kommt max. 1 mal je GB vor und hat keine Relation auf Person.
164  LEFT JOIN
165   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
166       FROM ax_namensnummer r
167       JOIN ax_buchungsblatt gr
168         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
169      LEFT JOIN alkis_wertearten wr
170        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft'
171      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
172   ON rg.gml_id = gb.gml_id  -- zum GB
173  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
174---------
175  UNION
176---------
177 SELECT  -- Fall: "Recht an"
178  -- F l u r s t ÃŒ c k
179    f.gml_id                             AS fsgml,       -- möglicher Filter FlurstÃŒcks-GML-ID
180    f.flurstueckskennzeichen             AS fs_kennz,
181    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
182    f.flurnummer, f.zaehler, f.nenner,
183    f.amtlicheflaeche                    AS fs_flae,
184    g.bezeichnung                        AS gemarkung,
185  -- G r u n d b u c h
186    gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
187    gb.bezirk                            AS gb_bezirk,
188    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
189    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
190  -- B u c h u n g s s t e l l e  (GrundstÃŒck)
191    s.laufendenummer                     AS bu_lfd,      -- BVNR
192    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
193    s.buchungsart,                                       -- verschlÃŒsselt
194    wb.v                                 AS bu_art,      -- Buchungsart entschlÃŒsselt
195  -- N a m e n s N u m m e r  (Normalfall mit Person)
196    nn.laufendenummernachdin1421         AS nam_lfd,
197    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
198  -- R e c h t s g e m e i n s c h a f t  (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
199    rg.artderrechtsgemeinschaft          AS nam_adr,
200    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
201    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
202  -- P e r s o n
203    p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
204    p.anrede,                                            -- Anrede key
205    wp.v                                 AS anrv,        -- Anrede Value zum Key
206    p.vorname,
207    p.namensbestandteil,
208    p.nachnameoderfirma,                                 -- Familienname
209    p.geburtsdatum,
210  -- A d r e s s e  der Person
211    a.postleitzahlpostzustellung         AS plz,
212    a.ort_post                           AS ort,         -- Anschreifenzeile 1: PLZ+Ort
213    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
214    a.bestimmungsland                    AS land
215  FROM ax_flurstueck f                  -- FlurstÃŒck
216  JOIN ax_gemarkung g                   -- entschlÃŒsseln
217    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
218  -- FS >istGebucht> Buchungstelle  <an<  Buchungstelle
219 -- Variante mit 2 Buchungs-Stellen (Recht An)
220  JOIN ax_buchungsstelle dien           -- dienende Buchung
221    ON f.istgebucht = dien.gml_id
222  JOIN ax_buchungsstelle s              -- herrschende Buchung
223    ON dien.gml_id = ANY (s.an)         -- hat Recht an
224  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
225    ON gb.gml_id = s.istbestandteilvon
226  JOIN ax_buchungsblattbezirk z
227    ON gb.land=z.land AND gb.bezirk=z.bezirk
228  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
229    ON gb.gml_id = nn.istbestandteilvon
230  JOIN ax_person p                      -- NamNum >benennt> Person
231    ON p.gml_id = nn.benennt
232  LEFT JOIN ax_anschrift a               -- nur die "letzte" Anschrift zur Person verwenden
233    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.gml_id DESC LIMIT 1)
234  -- E n t s c h l ÃŒ s s e l n:
235  LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
236    ON cast(p.anrede AS character varying)=wp.k AND wp.element='ax_person' AND wp.bezeichnung='anrede'
237  LEFT JOIN alkis_wertearten wb         -- EntschlÃŒsseln "Buchungsart"
238    ON cast(s.buchungsart AS character varying) = wb.k
239   AND wb.element = 'ax_buchungsstelle'
240   AND wb.bezeichnung = 'buchungsart'
241  LEFT JOIN
242   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
243       FROM ax_namensnummer r
244       JOIN ax_buchungsblatt gr
245         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
246      LEFT JOIN alkis_wertearten wr
247        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft'
248      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
249   ON rg.gml_id = gb.gml_id  -- zum GB
250  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
251    AND dien.endet IS NULL
252
253ORDER BY fs_kennz,   -- f.flurstueckskennzeichen,
254      -- fsgml,     
255         gb_bezirk,  -- gb.bezirk,
256         gb_blatt,   -- gb.buchungsblattnummermitbuchstabenerweiterung,
257         bu_lfd,     -- s.laufendenummer,
258         nam_lfd;    -- nn.laufendenummernachdin1421
259
260COMMENT ON VIEW exp_csv
261 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.';
262
263
264-- Eine Variante des View "exp_csv":
265-- Hier wird zusÀtzlich die Lagebezeichnung zum FlurstÌck angebunden in den Varianten MIT/OHNE Hausnummer.
266-- Der Filter "WHERE stgml= " auf die "gml_id" von "ax_lagebezeichnungkatalogeintrag" sollte gesetzt werden,
267-- um nur die FlurstÃŒcke zu bekommen, die an einer Straße liegen.
268
269DROP VIEW IF EXISTS exp_csv_str;
270
271CREATE OR REPLACE VIEW exp_csv_str
272AS      -- Version mit 4fach-UNION (2x2 FÀlle) statt eingebauter View "flst_an_strasse"
273 SELECT -- Fall 1: einfache Buchung (ohne Recht an)  // Lagebezeichnung MIT Hausnummer
274    sm.gml_id                            AS stgml,       -- Filter: gml_id der Straße aus "ax_lagebezeichnungkatalogeintrag"
275    'm'                                  AS fall,        -- SÀtze unterschieden: MIT HsNr
276  -- F l u r s t ÃŒ c k
277    f.gml_id                             AS fsgml,       -- möglicher Filter FlurstÃŒcks-GML-ID
278    f.flurstueckskennzeichen             AS fs_kennz,
279    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
280    f.flurnummer, f.zaehler, f.nenner,
281    f.amtlicheflaeche                    AS fs_flae,
282    g.bezeichnung                        AS gemarkung,
283  -- G r u n d b u c h
284  --gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
285    gb.bezirk                            AS gb_bezirk,
286    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
287    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
288  -- B u c h u n g s s t e l l e  (GrundstÃŒck)
289    s.laufendenummer                     AS bu_lfd,      -- BVNR
290    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
291    s.buchungsart,                                       -- verschlÃŒsselt
292    wb.v                                 AS bu_art,      -- Buchungsart entschlÃŒsselt
293  -- N a m e n s N u m m e r  (Normalfall mit Person)
294    nn.laufendenummernachdin1421         AS nam_lfd,
295    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
296  -- R e c h t s g e m e i n s c h a f t  (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
297    rg.artderrechtsgemeinschaft          AS nam_adr,
298    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
299    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
300  -- P e r s o n
301  --p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
302    p.anrede,                                            -- Anrede key
303    wp.v                                 AS anrv,        -- Anrede Value zum Key
304    p.vorname,
305    p.namensbestandteil,
306    p.nachnameoderfirma,                                 -- Familienname
307    p.geburtsdatum,
308  -- A d r e s s e  der Person
309    a.postleitzahlpostzustellung         AS plz,
310    a.ort_post                           AS ort,         -- Anschriftenzeile 1: PLZ+Ort
311    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
312    a.bestimmungsland                    AS land
313  FROM ax_flurstueck    f               -- FlurstÃŒck
314  -- FlurstÃŒck >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
315  JOIN ax_lagebezeichnungmithausnummer lm -- Lage MIT
316    ON lm.gml_id = ANY (f.weistauf)
317  JOIN ax_lagebezeichnungkatalogeintrag sm
318   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
319   JOIN ax_gemarkung g                   -- entschlÃŒsseln
320    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
321  JOIN ax_buchungsstelle s              -- FS >istGebucht> Buchungstelle
322    ON f.istgebucht = s.gml_id
323  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
324    ON gb.gml_id = s.istbestandteilvon
325  JOIN ax_buchungsblattbezirk z
326    ON gb.land=z.land AND gb.bezirk=z.bezirk
327  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
328    ON gb.gml_id = nn.istbestandteilvon
329  JOIN ax_person p                      -- NamNum >benennt> Person
330    ON p.gml_id = nn.benennt
331  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
332    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.gml_id DESC LIMIT 1)
333  -- E n t s c h l ÃŒ s s e l n:
334  LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
335    ON cast(p.anrede AS character varying) = wp.k
336   AND wp.element = 'ax_person'
337   AND wp.bezeichnung = 'anrede'
338  LEFT JOIN alkis_wertearten wb         -- EntschlÃŒsseln "Buchungsart"
339    ON cast(s.buchungsart AS character varying) = wb.k
340 -- buchungsart = integer / .k  = char 4stellig
341   AND wb.element = 'ax_buchungsstelle'
342   AND wb.bezeichnung = 'buchungsart'
343  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen:
344  -- Noch mal "GB -> NamNum", aber dieses Mal fÃŒr "Rechtsgemeinschaft".
345  -- Kommt max. 1 mal je GB vor und hat keine Relation auf Person.
346  LEFT JOIN
347   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
348       FROM ax_namensnummer r
349       JOIN ax_buchungsblatt gr
350         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
351      LEFT JOIN alkis_wertearten wr
352        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft'
353      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
354   ON rg.gml_id = gb.gml_id  -- zum GB
355  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 AND lm.endet IS NULL 
356---------
357  UNION
358---------
359 SELECT -- Fall 2: 2 Buchungs-Stellen (Recht An)  //  Lagebezeichnung MIT Hausnummer
360    sm.gml_id                            AS stgml,       -- Filter: gml_id der Straße aus "ax_lagebezeichnungkatalogeintrag"
361    'm'                                  AS fall,        -- SÀtze unterschieden: MIT HsNr
362  -- F l u r s t ÃŒ c k
363    f.gml_id                             AS fsgml,       -- möglicher Filter FlurstÃŒcks-GML-ID
364    f.flurstueckskennzeichen             AS fs_kennz,
365    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
366    f.flurnummer, f.zaehler, f.nenner,
367    f.amtlicheflaeche                    AS fs_flae,
368    g.bezeichnung                        AS gemarkung,
369  -- G r u n d b u c h
370  --gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
371    gb.bezirk                            AS gb_bezirk,
372    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
373    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
374  -- B u c h u n g s s t e l l e  (GrundstÃŒck)
375    s.laufendenummer                     AS bu_lfd,      -- BVNR
376    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
377    s.buchungsart,                                       -- verschlÃŒsselt
378    wb.v                                 AS bu_art,      -- Buchungsart entschlÃŒsselt
379  -- N a m e n s N u m m e r  (Normalfall mit Person)
380    nn.laufendenummernachdin1421         AS nam_lfd,
381    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
382  -- R e c h t s g e m e i n s c h a f t  (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
383    rg.artderrechtsgemeinschaft          AS nam_adr,
384    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
385    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
386  -- P e r s o n
387  --p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
388    p.anrede,                                            -- Anrede key
389    wp.v                                 AS anrv,        -- Anrede Value zum Key
390    p.vorname,
391    p.namensbestandteil,
392    p.nachnameoderfirma,                                 -- Familienname
393    p.geburtsdatum,
394   -- A d r e s s e  der Person
395    a.postleitzahlpostzustellung         AS plz,
396    a.ort_post                           AS ort,         -- Anschriftenzeile 1: PLZ+Ort
397    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
398    a.bestimmungsland                    AS land
399  FROM ax_flurstueck f                  -- FlurstÃŒck
400  -- FlurstÃŒck >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
401  JOIN ax_lagebezeichnungmithausnummer lm  -- Lage MIT
402    ON lm.gml_id = ANY (f.weistauf)
403  JOIN ax_lagebezeichnungkatalogeintrag sm
404    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
405  JOIN ax_gemarkung g                   -- entschlÃŒsseln
406    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
407  -- FS >istGebucht> Buchungstelle  <an<  Buchungstelle
408 -- Variante mit 2 Buchungs-Stellen (Recht An)
409  JOIN ax_buchungsstelle dien           -- dienende Buchung
410    ON f.istgebucht = dien.gml_id
411  JOIN ax_buchungsstelle s              -- herrschende Buchung
412    ON dien.gml_id = ANY (s.an)         -- hat Recht an
413  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
414    ON gb.gml_id = s.istbestandteilvon
415  JOIN ax_buchungsblattbezirk z
416    ON gb.land=z.land AND gb.bezirk=z.bezirk
417  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
418    ON gb.gml_id = nn.istbestandteilvon
419  JOIN ax_person p                      -- NamNum >benennt> Person
420    ON p.gml_id = nn.benennt
421  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
422    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.gml_id DESC LIMIT 1)
423  -- E n t s c h l ÃŒ s s e l n:
424  LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
425    ON cast(p.anrede AS character varying)=wp.k AND wp.element='ax_person' AND wp.bezeichnung='anrede'
426  LEFT JOIN alkis_wertearten wb         -- EntschlÃŒsseln "Buchungsart"
427    ON cast(s.buchungsart AS character varying) = wb.k
428   AND wb.element = 'ax_buchungsstelle'
429   AND wb.bezeichnung = 'buchungsart'
430  LEFT JOIN
431   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
432       FROM ax_namensnummer r
433       JOIN ax_buchungsblatt gr
434         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
435      LEFT JOIN alkis_wertearten wr
436        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft'
437      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
438   ON rg.gml_id = gb.gml_id  -- zum GB
439  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
440    AND dien.endet IS NULL AND lm.endet IS NULL 
441---------
442  UNION
443---------
444 SELECT -- Fall 3: einfache Buchung (ohne Recht an)  //  Lagebezeichnung OHNE Hausnummer
445    so.gml_id                            AS stgml,       -- Filter: gml_id der Straße aus "ax_lagebezeichnungkatalogeintrag"
446    'o'                                  AS fall,        -- SÀtze unterschieden: OHNE HsNr
447  -- F l u r s t ÃŒ c k
448    f.gml_id                             AS fsgml,       -- möglicher Filter FlurstÃŒcks-GML-ID
449    f.flurstueckskennzeichen             AS fs_kennz,
450    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
451    f.flurnummer, f.zaehler, f.nenner,
452    f.amtlicheflaeche                    AS fs_flae,
453    g.bezeichnung                        AS gemarkung,
454  -- G r u n d b u c h
455  --gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
456    gb.bezirk                            AS gb_bezirk,
457    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
458    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
459  -- B u c h u n g s s t e l l e  (GrundstÃŒck)
460    s.laufendenummer                     AS bu_lfd,      -- BVNR
461    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
462    s.buchungsart,                                       -- verschlÃŒsselt
463    wb.v                                 AS bu_art,      -- Buchungsart entschlÃŒsselt
464  -- N a m e n s N u m m e r  (Normalfall mit Person)
465    nn.laufendenummernachdin1421         AS nam_lfd,
466    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
467  -- R e c h t s g e m e i n s c h a f t  (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
468    rg.artderrechtsgemeinschaft          AS nam_adr,
469    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
470    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
471  -- P e r s o n
472  --p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
473    p.anrede,                                            -- Anrede key
474    wp.v                                 AS anrv,        -- Anrede Value zum Key
475    p.vorname,
476    p.namensbestandteil,
477    p.nachnameoderfirma,                                 -- Familienname
478    p.geburtsdatum,
479  -- A d r e s s e  der Person
480    a.postleitzahlpostzustellung         AS plz,
481    a.ort_post                           AS ort,         -- Anschriftenzeile 1: PLZ+Ort
482    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
483    a.bestimmungsland                    AS land
484  FROM ax_flurstueck    f               -- FlurstÃŒck
485-- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
486  JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
487    ON lo.gml_id = ANY (f.zeigtauf)
488  JOIN ax_lagebezeichnungkatalogeintrag so -- Straße OHNE
489    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
490  JOIN ax_gemarkung g                   -- entschlÃŒsseln
491    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
492  JOIN ax_buchungsstelle s              -- FS >istGebucht> Buchungstelle
493    ON f.istgebucht = s.gml_id
494  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
495    ON gb.gml_id = s.istbestandteilvon
496  JOIN ax_buchungsblattbezirk z
497    ON gb.land=z.land AND gb.bezirk=z.bezirk
498  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
499    ON gb.gml_id = nn.istbestandteilvon
500  JOIN ax_person p                      -- NamNum >benennt> Person
501    ON p.gml_id = nn.benennt
502  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
503    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.gml_id DESC LIMIT 1)
504  -- E n t s c h l ÃŒ s s e l n:
505  LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
506    ON cast(p.anrede AS character varying) = wp.k
507   AND wp.element = 'ax_person'
508   AND wp.bezeichnung = 'anrede'
509  LEFT JOIN alkis_wertearten wb         -- EntschlÃŒsseln "Buchungsart"
510    ON cast(s.buchungsart AS character varying) = wb.k
511 -- buchungsart = integer / .k  = char 4stellig
512   AND wb.element = 'ax_buchungsstelle'
513   AND wb.bezeichnung = 'buchungsart'
514  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen:
515  -- Noch mal "GB -> NamNum", aber dieses Mal fÃŒr "Rechtsgemeinschaft".
516  -- Kommt max. 1 mal je GB vor und hat keine Relation auf Person.
517  LEFT JOIN
518   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
519       FROM ax_namensnummer r
520       JOIN ax_buchungsblatt gr
521         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
522      LEFT JOIN alkis_wertearten wr
523        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft'
524      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
525   ON rg.gml_id = gb.gml_id  -- zum GB
526  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 AND lo.endet IS NULL
527---------
528  UNION
529---------
530 SELECT -- Fall 4: 2 Buchungs-Stellen (Recht An)  //  Lagebezeichnung OHNE Hausnummer
531    so.gml_id                            AS stgml,       -- Filter: gml_id der Straße aus "ax_lagebezeichnungkatalogeintrag"
532    'o'                                  AS fall,        -- SÀtze unterschieden: OHNE HsNr
533  -- F l u r s t ÃŒ c k
534    f.gml_id                             AS fsgml,       -- möglicher Filter FlurstÃŒcks-GML-ID
535    f.flurstueckskennzeichen             AS fs_kennz,
536    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
537    f.flurnummer, f.zaehler, f.nenner,
538    f.amtlicheflaeche                    AS fs_flae,
539    g.bezeichnung                        AS gemarkung,
540  -- G r u n d b u c h
541  --gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
542    gb.bezirk                            AS gb_bezirk,
543    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
544    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
545  -- B u c h u n g s s t e l l e  (GrundstÃŒck)
546    s.laufendenummer                     AS bu_lfd,      -- BVNR
547    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
548    s.buchungsart,                                       -- verschlÃŒsselt
549    wb.v                                 AS bu_art,      -- Buchungsart entschlÃŒsselt
550  -- N a m e n s N u m m e r  (Normalfall mit Person)
551    nn.laufendenummernachdin1421         AS nam_lfd,
552    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
553  -- R e c h t s g e m e i n s c h a f t  (Sonderfall von Namensnummer, ohne Person, ohne Nummer)
554    rg.artderrechtsgemeinschaft          AS nam_adr,
555    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
556    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
557  -- P e r s o n
558  --p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
559    p.anrede,                                            -- Anrede key
560    wp.v                                 AS anrv,        -- Anrede Value zum Key
561    p.vorname,
562    p.namensbestandteil,
563    p.nachnameoderfirma,                                 -- Familienname
564    p.geburtsdatum,
565   -- A d r e s s e  der Person
566    a.postleitzahlpostzustellung         AS plz,
567    a.ort_post                           AS ort,         -- Anschriftenzeile 1: PLZ+Ort
568    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
569    a.bestimmungsland                    AS land
570  FROM ax_flurstueck f                  -- FlurstÃŒck
571-- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
572  JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
573    ON lo.gml_id = ANY (f.zeigtauf)
574  JOIN ax_lagebezeichnungkatalogeintrag so -- Straße OHNE
575    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
576  JOIN ax_gemarkung g                   -- entschlÃŒsseln
577    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
578  -- FS >istGebucht> Buchungstelle  <an<  Buchungstelle
579 -- Variante mit 2 Buchungs-Stellen (Recht An)
580  JOIN ax_buchungsstelle dien           -- dienende Buchung
581    ON f.istgebucht = dien.gml_id
582  JOIN ax_buchungsstelle s              -- herrschende Buchung
583    ON dien.gml_id = ANY (s.an)         -- hat Recht an
584  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
585    ON gb.gml_id = s.istbestandteilvon
586  JOIN ax_buchungsblattbezirk z
587    ON gb.land=z.land AND gb.bezirk=z.bezirk
588  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
589    ON gb.gml_id = nn.istbestandteilvon
590  JOIN ax_person p                      -- NamNum >benennt> Person
591    ON p.gml_id = nn.benennt
592  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
593    ON a.gml_id = (SELECT gml_id FROM ax_anschrift an WHERE an.gml_id = ANY(p.hat) AND an.endet IS NULL ORDER BY an.gml_id DESC LIMIT 1)
594  -- E n t s c h l ÃŒ s s e l n:
595  LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
596    ON cast(p.anrede AS character varying)=wp.k AND wp.element='ax_person' AND wp.bezeichnung='anrede'
597  LEFT JOIN alkis_wertearten wb         -- EntschlÃŒsseln "Buchungsart"
598    ON cast(s.buchungsart AS character varying) = wb.k
599   AND wb.element = 'ax_buchungsstelle'
600   AND wb.bezeichnung = 'buchungsart'
601  LEFT JOIN
602   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
603       FROM ax_namensnummer r
604       JOIN ax_buchungsblatt gr
605         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
606      LEFT JOIN alkis_wertearten wr
607        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft'
608      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
609   ON rg.gml_id = gb.gml_id  -- zum GB
610  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
611    AND dien.endet IS NULL AND lo.endet IS NULL
612
613ORDER BY fs_kennz,   -- f.flurstueckskennzeichen,
614         gb_bezirk,  -- gb.bezirk,
615         gb_blatt,   -- gb.buchungsblattnummermitbuchstabenerweiterung,
616         bu_lfd,     -- s.laufendenummer,
617         nam_lfd;    -- nn.laufendenummernachdin1421
618
619COMMENT ON VIEW exp_csv_str
620 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.';
621
622
623-- Berechtigung
624-- ============
625  GRANT SELECT ON TABLE public.exp_csv          TO mb27;
626  GRANT SELECT ON TABLE public.exp_csv_str      TO mb27;
627
628-- Ende --
Note: See TracBrowser for help on using the repository browser.