source: trunk/import/norgis_alkis_pp/postcreate.d/views_exp_csv.sql @ 406

Revision 406, 34.9 KB checked in by frank.jaeger, 20 months ago (diff)

View "exp_csv" erweitert für Export aus Auskunft-Modul Grundstücksnachweis (Buchung).

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--  2017-12-20 Suche (Sortierung) 'letzte Adresse' nach "beginnt" statt nach "gml_id"
24--  2018-05-02 Aufruf aus GrundstÃŒcksnahweis: tabtyp='buchung' $filter="gsgml"
25
26-- ToDo:
27--  - Überdenken: Ist die UNION-Abfrage mit "Recht an" notwendig und sinnvoll?
28--    -- Wenn ja, bei welchen Filtern?
29--       Ein Erbbaurecht wird geliefert (1x "an") aber Untererbbaurecht nicht mehr (2x Recht "an")
30
31
32-- I n d i c e s
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
46-- Generelle Export-Struktur "FlurstÃŒck - Buchung - Grundbuch - Person"
47-- --------------------------------------------------------------------
48-- Wird benötigt im Auskunft-Modul "alkisexport.php":
49-- Je nach aufrufendem Modul wird der Filter (WHERE) an anderer Stelle gesetzt (gml_id von FS, GB oder Pers.)
50-- FÃŒr Filter nach "Straße" siehe die nachfolgende Sonderversion "exp_csv_str".
51
52-- Problem / Konflikt:
53-- Es kann nur eine lineare Struktur aus Spalten und Zeilen exportiert werden.
54-- Wenn nicht nur die Daten des Ausgangs-Objektes exportiert werden, sondern auch verbundene Tabellen in
55-- einer 1:N-Struktur, dann verdoppeln sich Zeileninhalte und es werden redundante Daten erzeugt.
56-- Diese Redundanzen mÃŒssen vom dem Programm gefiltert werden, das die Daten ÃŒber eine Schnittstelle einliest.
57-- Anwendungs-Beispiel: Abrechnung von AnliegerbeitrÀgen.
58
59DROP VIEW IF EXISTS exp_csv;
60CREATE OR REPLACE VIEW exp_csv
61AS
62 SELECT -- Fall: einfache Buchung (ohne "Recht an")
63  -- F l u r s t ÃŒ c k
64    f.gml_id                             AS fsgml,       -- möglicher Filter FlurstÃŒcks-GML-ID
65    f.flurstueckskennzeichen             AS fs_kennz,
66    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
67    f.flurnummer, f.zaehler, f.nenner,
68    f.amtlicheflaeche                    AS fs_flae,
69    g.bezeichnung                        AS gemarkung,
70  -- G r u n d b u c h
71    gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
72    gb.bezirk                            AS gb_bezirk,
73    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
74    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
75  -- B u c h u n g s s t e l l e  (GrundstÃŒck)
76    s.gml_id                             AS gsgml,       -- möglicher Filter GrundstÃŒck-GML-ID
77    s.laufendenummer                     AS bu_lfd,      -- BVNR
78    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
79    s.buchungsart,                                       -- verschlÃŒsselt
80    wb.v                                 AS bu_art,      -- Buchungsart entschlÃŒsselt
81  -- N a m e n s N u m m e r  (Normalfall mit Person)
82    nn.laufendenummernachdin1421         AS nam_lfd,
83    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
84  -- 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)
85    rg.artderrechtsgemeinschaft          AS nam_adr,
86    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
87    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
88  -- P e r s o n
89    p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
90    p.anrede,                                            -- Anrede key
91    wp.v                                 AS anrv,        -- Anrede Value zum Key
92    p.vorname,
93    p.namensbestandteil,
94    p.nachnameoderfirma,                                 -- Familienname
95    p.geburtsdatum,
96  -- A d r e s s e  der Person
97    a.postleitzahlpostzustellung         AS plz,
98    a.ort_post                           AS ort,         -- Anschreifenzeile 1: PLZ+Ort
99    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
100    a.bestimmungsland                    AS land
101   FROM ax_flurstueck    f               -- FlurstÃŒck
102  JOIN ax_gemarkung g                   -- entschlÃŒsseln
103    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
104  JOIN ax_buchungsstelle s              -- FS >istGebucht> Buchungstelle
105    ON f.istgebucht = s.gml_id
106  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
107    ON gb.gml_id = s.istbestandteilvon
108  JOIN ax_buchungsblattbezirk z
109    ON gb.land=z.land AND gb.bezirk=z.bezirk
110  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
111    ON gb.gml_id = nn.istbestandteilvon
112  JOIN ax_person p                      -- NamNum >benennt> Person
113    ON p.gml_id = nn.benennt
114  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
115    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.beginnt DESC LIMIT 1)
116  -- E n t s c h l ÃŒ s s e l n:
117  LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
118    ON cast(p.anrede AS character varying) = wp.k
119   AND wp.element = 'ax_person'
120   AND wp.bezeichnung = 'anrede'
121  LEFT JOIN alkis_wertearten wb         -- EntschlÃŒsseln "Buchungsart"
122    ON cast(s.buchungsart AS character varying) = wb.k
123 -- buchungsart = integer / .k  = char 4stellig
124   AND wb.element = 'ax_buchungsstelle'
125   AND wb.bezeichnung = 'buchungsart'
126  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen:
127  -- Noch mal "GB -> NamNum", aber dieses Mal fÃŒr "Rechtsgemeinschaft".
128  -- Kommt max. 1 mal je GB vor und hat keine Relation auf Person.
129  LEFT JOIN
130   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
131       FROM ax_namensnummer r
132       JOIN ax_buchungsblatt gr
133         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
134      LEFT JOIN alkis_wertearten wr
135        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft'
136      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
137   ON rg.gml_id = gb.gml_id  -- zum GB
138  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
139---------
140  UNION
141---------
142 SELECT  -- Fall: "Recht an"
143  -- F l u r s t ÃŒ c k
144    f.gml_id                             AS fsgml,       -- möglicher Filter FlurstÃŒcks-GML-ID
145    f.flurstueckskennzeichen             AS fs_kennz,
146    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
147    f.flurnummer, f.zaehler, f.nenner,
148    f.amtlicheflaeche                    AS fs_flae,
149    g.bezeichnung                        AS gemarkung,
150  -- G r u n d b u c h
151    gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
152    gb.bezirk                            AS gb_bezirk,
153    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
154    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
155  -- B u c h u n g s s t e l l e  (GrundstÃŒck)
156    dien.gml_id                          AS gsgml,       -- möglicher Filter GrundstÃŒck-GML-ID
157    s.laufendenummer                     AS bu_lfd,      -- BVNR
158    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
159    s.buchungsart,                                       -- verschlÃŒsselt
160    wb.v                                 AS bu_art,      -- Buchungsart entschlÃŒsselt
161  -- N a m e n s N u m m e r  (Normalfall mit Person)
162    nn.laufendenummernachdin1421         AS nam_lfd,
163    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
164  -- 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)
165    rg.artderrechtsgemeinschaft          AS nam_adr,
166    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
167    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
168  -- P e r s o n
169    p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
170    p.anrede,                                            -- Anrede key
171    wp.v                                 AS anrv,        -- Anrede Value zum Key
172    p.vorname,
173    p.namensbestandteil,
174    p.nachnameoderfirma,                                 -- Familienname
175    p.geburtsdatum,
176  -- A d r e s s e  der Person
177    a.postleitzahlpostzustellung         AS plz,
178    a.ort_post                           AS ort,         -- Anschreifenzeile 1: PLZ+Ort
179    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
180    a.bestimmungsland                    AS land
181  FROM ax_flurstueck f                  -- FlurstÃŒck
182  JOIN ax_gemarkung g                   -- entschlÃŒsseln
183    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
184  -- FS >istGebucht> Buchungstelle  <an<  Buchungstelle
185 -- Variante mit 2 Buchungs-Stellen (Recht An)
186  JOIN ax_buchungsstelle dien           -- dienende Buchung
187    ON f.istgebucht = dien.gml_id
188  JOIN ax_buchungsstelle s              -- herrschende Buchung
189    ON dien.gml_id = ANY (s.an)         -- hat Recht an
190  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
191    ON gb.gml_id = s.istbestandteilvon
192  JOIN ax_buchungsblattbezirk z
193    ON gb.land=z.land AND gb.bezirk=z.bezirk
194  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
195    ON gb.gml_id = nn.istbestandteilvon
196  JOIN ax_person p                      -- NamNum >benennt> Person
197    ON p.gml_id = nn.benennt
198  LEFT JOIN ax_anschrift a               -- nur die "letzte" Anschrift zur Person verwenden
199    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.beginnt DESC LIMIT 1)
200  -- E n t s c h l ÃŒ s s e l n:
201  LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
202    ON cast(p.anrede AS character varying)=wp.k AND wp.element='ax_person' AND wp.bezeichnung='anrede'
203  LEFT JOIN alkis_wertearten wb         -- EntschlÃŒsseln "Buchungsart"
204    ON cast(s.buchungsart AS character varying) = wb.k
205   AND wb.element = 'ax_buchungsstelle'
206   AND wb.bezeichnung = 'buchungsart'
207  LEFT JOIN
208   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
209       FROM ax_namensnummer r
210       JOIN ax_buchungsblatt gr
211         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
212      LEFT JOIN alkis_wertearten wr
213        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft'
214      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
215   ON rg.gml_id = gb.gml_id  -- zum GB
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    AND dien.endet IS NULL
218
219ORDER BY fs_kennz,   -- f.flurstueckskennzeichen,
220      -- fsgml,     
221         gb_bezirk,  -- gb.bezirk,
222         gb_blatt,   -- gb.buchungsblattnummermitbuchstabenerweiterung,
223         bu_lfd,     -- s.laufendenummer,
224         nam_lfd;    -- nn.laufendenummernachdin1421
225
226COMMENT ON VIEW exp_csv
227 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.';
228
229GRANT SELECT ON TABLE public.exp_csv          TO mb27;
230
231-- Eine Variante des View "exp_csv":
232-- Hier wird zusÀtzlich die Lagebezeichnung zum FlurstÌck angebunden in den Varianten MIT/OHNE Hausnummer.
233-- Der Filter "WHERE stgml= " auf die "gml_id" von "ax_lagebezeichnungkatalogeintrag" sollte gesetzt werden,
234-- um nur die FlurstÃŒcke zu bekommen, die an einer Straße liegen.
235
236DROP VIEW IF EXISTS exp_csv_str;
237
238CREATE OR REPLACE VIEW exp_csv_str
239AS      -- Version mit 4fach-UNION (2x2 FÀlle) statt eingebauter View "flst_an_strasse"
240 SELECT -- Fall 1: einfache Buchung (ohne Recht an)  // Lagebezeichnung MIT Hausnummer
241    sm.gml_id                            AS stgml,       -- Filter: gml_id der Straße aus "ax_lagebezeichnungkatalogeintrag"
242    'm'                                  AS fall,        -- SÀtze unterschieden: MIT HsNr
243  -- F l u r s t ÃŒ c k
244    f.gml_id                             AS fsgml,       -- möglicher Filter FlurstÃŒcks-GML-ID
245    f.flurstueckskennzeichen             AS fs_kennz,
246    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
247    f.flurnummer, f.zaehler, f.nenner,
248    f.amtlicheflaeche                    AS fs_flae,
249    g.bezeichnung                        AS gemarkung,
250  -- G r u n d b u c h
251  --gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
252    gb.bezirk                            AS gb_bezirk,
253    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
254    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
255  -- B u c h u n g s s t e l l e  (GrundstÃŒck)
256    s.laufendenummer                     AS bu_lfd,      -- BVNR
257    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
258    s.buchungsart,                                       -- verschlÃŒsselt
259    wb.v                                 AS bu_art,      -- Buchungsart entschlÃŒsselt
260  -- N a m e n s N u m m e r  (Normalfall mit Person)
261    nn.laufendenummernachdin1421         AS nam_lfd,
262    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
263  -- 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)
264    rg.artderrechtsgemeinschaft          AS nam_adr,
265    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
266    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
267  -- P e r s o n
268  --p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
269    p.anrede,                                            -- Anrede key
270    wp.v                                 AS anrv,        -- Anrede Value zum Key
271    p.vorname,
272    p.namensbestandteil,
273    p.nachnameoderfirma,                                 -- Familienname
274    p.geburtsdatum,
275  -- A d r e s s e  der Person
276    a.postleitzahlpostzustellung         AS plz,
277    a.ort_post                           AS ort,         -- Anschriftenzeile 1: PLZ+Ort
278    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
279    a.bestimmungsland                    AS land
280  FROM ax_flurstueck    f               -- FlurstÃŒck
281  -- FlurstÃŒck >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
282  JOIN ax_lagebezeichnungmithausnummer lm -- Lage MIT
283    ON lm.gml_id = ANY (f.weistauf)
284  JOIN ax_lagebezeichnungkatalogeintrag sm
285   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
286   JOIN ax_gemarkung g                   -- entschlÃŒsseln
287    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
288  JOIN ax_buchungsstelle s              -- FS >istGebucht> Buchungstelle
289    ON f.istgebucht = s.gml_id
290  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
291    ON gb.gml_id = s.istbestandteilvon
292  JOIN ax_buchungsblattbezirk z
293    ON gb.land=z.land AND gb.bezirk=z.bezirk
294  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
295    ON gb.gml_id = nn.istbestandteilvon
296  JOIN ax_person p                      -- NamNum >benennt> Person
297    ON p.gml_id = nn.benennt
298  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
299    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.beginnt DESC LIMIT 1)
300  -- E n t s c h l ÃŒ s s e l n:
301  LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
302    ON cast(p.anrede AS character varying) = wp.k
303   AND wp.element = 'ax_person'
304   AND wp.bezeichnung = 'anrede'
305  LEFT JOIN alkis_wertearten wb         -- EntschlÃŒsseln "Buchungsart"
306    ON cast(s.buchungsart AS character varying) = wb.k
307 -- buchungsart = integer / .k  = char 4stellig
308   AND wb.element = 'ax_buchungsstelle'
309   AND wb.bezeichnung = 'buchungsart'
310  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen:
311  -- Noch mal "GB -> NamNum", aber dieses Mal fÃŒr "Rechtsgemeinschaft".
312  -- Kommt max. 1 mal je GB vor und hat keine Relation auf Person.
313  LEFT JOIN
314   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
315       FROM ax_namensnummer r
316       JOIN ax_buchungsblatt gr
317         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
318      LEFT JOIN alkis_wertearten wr
319        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft'
320      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
321   ON rg.gml_id = gb.gml_id  -- zum GB
322  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 
323---------
324  UNION
325---------
326 SELECT -- Fall 2: 2 Buchungs-Stellen (Recht An)  //  Lagebezeichnung MIT Hausnummer
327    sm.gml_id                            AS stgml,       -- Filter: gml_id der Straße aus "ax_lagebezeichnungkatalogeintrag"
328    'm'                                  AS fall,        -- SÀtze unterschieden: MIT HsNr
329  -- F l u r s t ÃŒ c k
330    f.gml_id                             AS fsgml,       -- möglicher Filter FlurstÃŒcks-GML-ID
331    f.flurstueckskennzeichen             AS fs_kennz,
332    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
333    f.flurnummer, f.zaehler, f.nenner,
334    f.amtlicheflaeche                    AS fs_flae,
335    g.bezeichnung                        AS gemarkung,
336  -- G r u n d b u c h
337  --gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
338    gb.bezirk                            AS gb_bezirk,
339    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
340    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
341  -- B u c h u n g s s t e l l e  (GrundstÃŒck)
342    s.laufendenummer                     AS bu_lfd,      -- BVNR
343    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
344    s.buchungsart,                                       -- verschlÃŒsselt
345    wb.v                                 AS bu_art,      -- Buchungsart entschlÃŒsselt
346  -- N a m e n s N u m m e r  (Normalfall mit Person)
347    nn.laufendenummernachdin1421         AS nam_lfd,
348    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
349  -- 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)
350    rg.artderrechtsgemeinschaft          AS nam_adr,
351    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
352    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
353  -- P e r s o n
354  --p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
355    p.anrede,                                            -- Anrede key
356    wp.v                                 AS anrv,        -- Anrede Value zum Key
357    p.vorname,
358    p.namensbestandteil,
359    p.nachnameoderfirma,                                 -- Familienname
360    p.geburtsdatum,
361   -- A d r e s s e  der Person
362    a.postleitzahlpostzustellung         AS plz,
363    a.ort_post                           AS ort,         -- Anschriftenzeile 1: PLZ+Ort
364    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
365    a.bestimmungsland                    AS land
366  FROM ax_flurstueck f                  -- FlurstÃŒck
367  -- FlurstÃŒck >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
368  JOIN ax_lagebezeichnungmithausnummer lm  -- Lage MIT
369    ON lm.gml_id = ANY (f.weistauf)
370  JOIN ax_lagebezeichnungkatalogeintrag sm
371    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
372  JOIN ax_gemarkung g                   -- entschlÃŒsseln
373    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
374  -- FS >istGebucht> Buchungstelle  <an<  Buchungstelle
375 -- Variante mit 2 Buchungs-Stellen (Recht An)
376  JOIN ax_buchungsstelle dien           -- dienende Buchung
377    ON f.istgebucht = dien.gml_id
378  JOIN ax_buchungsstelle s              -- herrschende Buchung
379    ON dien.gml_id = ANY (s.an)         -- hat Recht an
380  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
381    ON gb.gml_id = s.istbestandteilvon
382  JOIN ax_buchungsblattbezirk z
383    ON gb.land=z.land AND gb.bezirk=z.bezirk
384  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
385    ON gb.gml_id = nn.istbestandteilvon
386  JOIN ax_person p                      -- NamNum >benennt> Person
387    ON p.gml_id = nn.benennt
388  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
389    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.beginnt DESC LIMIT 1)
390  -- E n t s c h l ÃŒ s s e l n:
391  LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
392    ON cast(p.anrede AS character varying)=wp.k AND wp.element='ax_person' AND wp.bezeichnung='anrede'
393  LEFT JOIN alkis_wertearten wb         -- EntschlÃŒsseln "Buchungsart"
394    ON cast(s.buchungsart AS character varying) = wb.k
395   AND wb.element = 'ax_buchungsstelle'
396   AND wb.bezeichnung = 'buchungsart'
397  LEFT JOIN
398   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
399       FROM ax_namensnummer r
400       JOIN ax_buchungsblatt gr
401         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
402      LEFT JOIN alkis_wertearten wr
403        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft'
404      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
405   ON rg.gml_id = gb.gml_id  -- zum GB
406  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
407    AND dien.endet IS NULL AND lm.endet IS NULL 
408---------
409  UNION
410---------
411 SELECT -- Fall 3: einfache Buchung (ohne Recht an)  //  Lagebezeichnung OHNE Hausnummer
412    so.gml_id                            AS stgml,       -- Filter: gml_id der Straße aus "ax_lagebezeichnungkatalogeintrag"
413    'o'                                  AS fall,        -- SÀtze unterschieden: OHNE HsNr
414  -- F l u r s t ÃŒ c k
415    f.gml_id                             AS fsgml,       -- möglicher Filter FlurstÃŒcks-GML-ID
416    f.flurstueckskennzeichen             AS fs_kennz,
417    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
418    f.flurnummer, f.zaehler, f.nenner,
419    f.amtlicheflaeche                    AS fs_flae,
420    g.bezeichnung                        AS gemarkung,
421  -- G r u n d b u c h
422  --gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
423    gb.bezirk                            AS gb_bezirk,
424    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
425    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
426  -- B u c h u n g s s t e l l e  (GrundstÃŒck)
427    s.laufendenummer                     AS bu_lfd,      -- BVNR
428    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
429    s.buchungsart,                                       -- verschlÃŒsselt
430    wb.v                                 AS bu_art,      -- Buchungsart entschlÃŒsselt
431  -- N a m e n s N u m m e r  (Normalfall mit Person)
432    nn.laufendenummernachdin1421         AS nam_lfd,
433    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
434  -- 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)
435    rg.artderrechtsgemeinschaft          AS nam_adr,
436    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
437    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
438  -- P e r s o n
439  --p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
440    p.anrede,                                            -- Anrede key
441    wp.v                                 AS anrv,        -- Anrede Value zum Key
442    p.vorname,
443    p.namensbestandteil,
444    p.nachnameoderfirma,                                 -- Familienname
445    p.geburtsdatum,
446  -- A d r e s s e  der Person
447    a.postleitzahlpostzustellung         AS plz,
448    a.ort_post                           AS ort,         -- Anschriftenzeile 1: PLZ+Ort
449    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
450    a.bestimmungsland                    AS land
451  FROM ax_flurstueck    f               -- FlurstÃŒck
452-- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
453  JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
454    ON lo.gml_id = ANY (f.zeigtauf)
455  JOIN ax_lagebezeichnungkatalogeintrag so -- Straße OHNE
456    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
457  JOIN ax_gemarkung g                   -- entschlÃŒsseln
458    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
459  JOIN ax_buchungsstelle s              -- FS >istGebucht> Buchungstelle
460    ON f.istgebucht = s.gml_id
461  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
462    ON gb.gml_id = s.istbestandteilvon
463  JOIN ax_buchungsblattbezirk z
464    ON gb.land=z.land AND gb.bezirk=z.bezirk
465  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
466    ON gb.gml_id = nn.istbestandteilvon
467  JOIN ax_person p                      -- NamNum >benennt> Person
468    ON p.gml_id = nn.benennt
469  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
470    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.beginnt DESC LIMIT 1)
471  -- E n t s c h l ÃŒ s s e l n:
472  LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
473    ON cast(p.anrede AS character varying) = wp.k
474   AND wp.element = 'ax_person'
475   AND wp.bezeichnung = 'anrede'
476  LEFT JOIN alkis_wertearten wb         -- EntschlÃŒsseln "Buchungsart"
477    ON cast(s.buchungsart AS character varying) = wb.k
478 -- buchungsart = integer / .k  = char 4stellig
479   AND wb.element = 'ax_buchungsstelle'
480   AND wb.bezeichnung = 'buchungsart'
481  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen:
482  -- Noch mal "GB -> NamNum", aber dieses Mal fÃŒr "Rechtsgemeinschaft".
483  -- Kommt max. 1 mal je GB vor und hat keine Relation auf Person.
484  LEFT JOIN
485   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
486       FROM ax_namensnummer r
487       JOIN ax_buchungsblatt gr
488         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
489      LEFT JOIN alkis_wertearten wr
490        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft'
491      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
492   ON rg.gml_id = gb.gml_id  -- zum GB
493  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
494---------
495  UNION
496---------
497 SELECT -- Fall 4: 2 Buchungs-Stellen (Recht An)  //  Lagebezeichnung OHNE Hausnummer
498    so.gml_id                            AS stgml,       -- Filter: gml_id der Straße aus "ax_lagebezeichnungkatalogeintrag"
499    'o'                                  AS fall,        -- SÀtze unterschieden: OHNE HsNr
500  -- F l u r s t ÃŒ c k
501    f.gml_id                             AS fsgml,       -- möglicher Filter FlurstÃŒcks-GML-ID
502    f.flurstueckskennzeichen             AS fs_kennz,
503    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
504    f.flurnummer, f.zaehler, f.nenner,
505    f.amtlicheflaeche                    AS fs_flae,
506    g.bezeichnung                        AS gemarkung,
507  -- G r u n d b u c h
508  --gb.gml_id                            AS gbgml,       -- möglicher Filter Grundbuch-GML-ID
509    gb.bezirk                            AS gb_bezirk,
510    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
511    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
512  -- B u c h u n g s s t e l l e  (GrundstÃŒck)
513    s.laufendenummer                     AS bu_lfd,      -- BVNR
514    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
515    s.buchungsart,                                       -- verschlÃŒsselt
516    wb.v                                 AS bu_art,      -- Buchungsart entschlÃŒsselt
517  -- N a m e n s N u m m e r  (Normalfall mit Person)
518    nn.laufendenummernachdin1421         AS nam_lfd,
519    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
520  -- 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)
521    rg.artderrechtsgemeinschaft          AS nam_adr,
522    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
523    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
524  -- P e r s o n
525  --p.gml_id                             AS psgml,       -- möglicher Filter Personen-GML-ID
526    p.anrede,                                            -- Anrede key
527    wp.v                                 AS anrv,        -- Anrede Value zum Key
528    p.vorname,
529    p.namensbestandteil,
530    p.nachnameoderfirma,                                 -- Familienname
531    p.geburtsdatum,
532   -- A d r e s s e  der Person
533    a.postleitzahlpostzustellung         AS plz,
534    a.ort_post                           AS ort,         -- Anschriftenzeile 1: PLZ+Ort
535    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
536    a.bestimmungsland                    AS land
537  FROM ax_flurstueck f                  -- FlurstÃŒck
538-- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
539  JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
540    ON lo.gml_id = ANY (f.zeigtauf)
541  JOIN ax_lagebezeichnungkatalogeintrag so -- Straße OHNE
542    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
543  JOIN ax_gemarkung g                   -- entschlÃŒsseln
544    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
545  -- FS >istGebucht> Buchungstelle  <an<  Buchungstelle
546 -- Variante mit 2 Buchungs-Stellen (Recht An)
547  JOIN ax_buchungsstelle dien           -- dienende Buchung
548    ON f.istgebucht = dien.gml_id
549  JOIN ax_buchungsstelle s              -- herrschende Buchung
550    ON dien.gml_id = ANY (s.an)         -- hat Recht an
551  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
552    ON gb.gml_id = s.istbestandteilvon
553  JOIN ax_buchungsblattbezirk z
554    ON gb.land=z.land AND gb.bezirk=z.bezirk
555  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
556    ON gb.gml_id = nn.istbestandteilvon
557  JOIN ax_person p                      -- NamNum >benennt> Person
558    ON p.gml_id = nn.benennt
559  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
560    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.beginnt DESC LIMIT 1)
561  -- E n t s c h l ÃŒ s s e l n:
562  LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
563    ON cast(p.anrede AS character varying)=wp.k AND wp.element='ax_person' AND wp.bezeichnung='anrede'
564  LEFT JOIN alkis_wertearten wb         -- EntschlÃŒsseln "Buchungsart"
565    ON cast(s.buchungsart AS character varying) = wb.k
566   AND wb.element = 'ax_buchungsstelle'
567   AND wb.bezeichnung = 'buchungsart'
568  LEFT JOIN
569   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
570       FROM ax_namensnummer r
571       JOIN ax_buchungsblatt gr
572         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft)
573      LEFT JOIN alkis_wertearten wr
574        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft'
575      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
576   ON rg.gml_id = gb.gml_id  -- zum GB
577  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
578    AND dien.endet IS NULL AND lo.endet IS NULL
579
580ORDER BY fs_kennz,   -- f.flurstueckskennzeichen,
581         gb_bezirk,  -- gb.bezirk,
582         gb_blatt,   -- gb.buchungsblattnummermitbuchstabenerweiterung,
583         bu_lfd,     -- s.laufendenummer,
584         nam_lfd;    -- nn.laufendenummernachdin1421
585
586COMMENT ON VIEW exp_csv_str
587 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.';
588
589
590GRANT SELECT ON TABLE public.exp_csv_str      TO mb27;
591
592-- Ende --
Note: See TracBrowser for help on using the repository browser.