source: trunk/import/norgis_alkis_pp/postcreate.d/6_views_exp_csv.sql @ 431

Revision 431, 36.1 KB checked in by frank.jaeger, 19 months ago (diff)

kleine Fehlerkorrekturen an der Auskunft

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