Index: trunk/import/norgis_alkis_pp/postcreate.de/views_exp_csv.sql
===================================================================
--- trunk/import/norgis_alkis_pp/postcreate.de/views_exp_csv.sql	(revision 396)
+++ trunk/import/norgis_alkis_pp/postcreate.de/views_exp_csv.sql	(revision 397)
@@ -4,9 +4,6 @@
 -- ===================================================================================
 
--- Aufgabe:
--- Views bereit stellen fÃŒr die ALKIS-Navigation fÃŒr Mapbender 2 und die Buch-Auskunft und spezielle WMS.
-
--- AusfÃŒhrung in:
--- Step "postcreate.d" des ALKIS-Importers. Hier also nur Definitionen machen, keine Daten bearbeiten.
+-- Aufgabe:       Views bereit stellen fÃŒr den CSV-Export in der ALKIS-Buch-Auskunft.
+-- AusfÃŒhrung in: Step "postcreate.d" des ALKIS-Importers. Hier also nur Definitionen machen, keine Daten bearbeiten.
 
 --Stand 
@@ -20,19 +17,21 @@
 --  2017-10-10 Berechtigungen rausgenommen in getrennte Datei
 --  2017-12-06 Umbenennung von "x_classic2norgis.sql" nach "views_exp_csv.sql"
+--  2017-12-20 Beseitigung des Fehlers: Mehrere Adressen zur Person fuehren zu mehrfachen Zeilen (Wiederholung FlurstÃŒck und Flaeche ..)
+--             Es wird je Persoon nur noch die "letzte" Adresse verwendet (subquery).
+--             Der View "exp_csv_str" ist jetzt direkt als 4fach-UNION (2x2) codiert statt mit eingebettetem gespeicherten 2fach-Union.
+--             Hauptvorteil: Keine undurchsichtigen AbhÃ€ngigkeiten. Ist auch etwas schneller.
 
 -- ToDo:
 --  - die alten Ãbersichten "pp_flur", "pp_gemarkung" und "pp_gemeinde" wieder erzeugen
 --    Siehe Script: "pp_gebiete.sql" (FÃŒllen) und Teile von "pp_definition.sql" (DB-Struktur).
---  - Statt den View "flst_an_strasse" im View "exp_csv_str" einzubinden kÃ¶nnte ein 4fach-UNION schneller sein. Testen.
 
 
 -- I n d i c e s
 -- ============================
-
 -- Tabelle "ax_gemarkungsteilflur" sollte Such-Index erhalten auf "gemarkung".
 -- FÃŒr Auflistung aller Fluren zur Gemarkung in Script "alkisnav_fls", Function "EineGemarkung".
 
 
--- Der WMS "Flurstuecke_Kommunal" (aus View "st_flurst[gkz][e|r]") wird langsam, wenn er in einer kreisweiten Datenbank ausgefÃŒhrt wird.
+-- Der WMS "Flurstuecke Kommunal" (aus View "st_flurst[gkz][e|r]") wird langsam, wenn er in einer kreisweiten Datenbank ausgefÃŒhrt wird.
 -- Das Filter-Feld benÃ¶tigt einen Index:
 DROP INDEX if exists ax_person_nname;
@@ -44,13 +43,12 @@
 -- ============================
 
-
 -- Bausteine fÃŒr andere Views:
 -- ---------------------------
-
 -- Ein View, der die Verbindung von FlurstÃŒck zur StraÃentabelle fÃŒr zwei verschiedene FÃ€lle herstellt.
 -- Einmal ÃŒber die Lagebezeichnung MIT Hausnummer und einmal OHNE.
 -- Dies kann als "MittelstÃŒck" in den anderen Views eingefÃŒgt werden.
 
---           DROP VIEW public.flst_an_strasse;
+   DROP VIEW if exists public.flst_an_strasse; -- wird nicht mehr verwendet
+/*
 CREATE OR REPLACE VIEW public.flst_an_strasse
 AS
@@ -79,7 +77,5 @@
 COMMENT ON VIEW public.flst_an_strasse 
  IS 'ALKIS-Beziehung von FlurstÃŒck zu StraÃentabelle. UNION-Zusammenfassung der FÃ€lle MIT und OHNE Hausnummer.';
-
--- Muss man noch dafÃŒr sorgen, dass FlurstÃŒck nicht doppelt vorkommt? z.B. mit DISTINCT
--- Oder mÃŒssen ggf. mehrfache FS im Programm ÃŒbersprungen werden?
+*/
 
 
@@ -97,9 +93,8 @@
 -- Anwendungs-Beispiel: Abrechnung von AnliegerbeitrÃ€gen.
 
-
 DROP VIEW IF EXISTS exp_csv;
 CREATE OR REPLACE VIEW exp_csv
 AS
- SELECT
+ SELECT -- Fall: einfache Buchung (ohne "Recht an")
   -- F l u r s t ÃŒ c k
     f.gml_id                             AS fsgml,       -- mÃ¶glicher Filter FlurstÃŒcks-GML-ID
@@ -139,5 +134,5 @@
     a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: StraÃe+HsNr
     a.bestimmungsland                    AS land
-  FROM ax_flurstueck    f               -- FlurstÃŒck
+   FROM ax_flurstueck    f               -- FlurstÃŒck
   JOIN ax_gemarkung g                   -- entschlÃŒsseln
     ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
@@ -152,6 +147,6 @@
   JOIN ax_person p                      -- NamNum >benennt> Person 
     ON p.gml_id = nn.benennt
-  LEFT JOIN ax_anschrift a 
-    ON a.gml_id = ANY (p.hat)
+  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
+    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)
   -- E n t s c h l ÃŒ s s e l n:
   LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
@@ -177,6 +172,8 @@
    ON rg.gml_id = gb.gml_id  -- zum GB
   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
-UNION
- SELECT
+---------
+  UNION
+---------
+ SELECT  -- Fall: "Recht an"
   -- F l u r s t ÃŒ c k
     f.gml_id                             AS fsgml,       -- mÃ¶glicher Filter FlurstÃŒcks-GML-ID
@@ -211,5 +208,5 @@
     p.nachnameoderfirma,                                 -- Familienname
     p.geburtsdatum,
-   -- A d r e s s e  der Person
+  -- A d r e s s e  der Person
     a.postleitzahlpostzustellung         AS plz,
     a.ort_post                           AS ort,         -- Anschreifenzeile 1: PLZ+Ort
@@ -233,6 +230,6 @@
   JOIN ax_person p                      -- NamNum >benennt> Person 
     ON p.gml_id = nn.benennt
-  LEFT JOIN ax_anschrift a 
-    ON a.gml_id = ANY (p.hat)
+  LEFT JOIN ax_anschrift a               -- nur die "letzte" Anschrift zur Person verwenden
+    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)
   -- E n t s c h l ÃŒ s s e l n:
   LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
@@ -266,6 +263,6 @@
 
 -- Eine Variante des View "exp_csv":
--- Hier wird zusÃ€tzlich der Baustein "flst_an_strasse" verwendet.
--- Der Filter "WHERE stgml= " auf die "gml_id" von "ax_lagebezeichnungkatalogeintrag" sollte gesetzt werden
+-- Hier wird zusÃ€tzlich die Lagebezeichnung zum FlurstÃŒck angebunden in den Varianten MIT/OHNE Hausnummer.
+-- Der Filter "WHERE stgml= " auf die "gml_id" von "ax_lagebezeichnungkatalogeintrag" sollte gesetzt werden,
 -- um nur die FlurstÃŒcke zu bekommen, die an einer StraÃe liegen.
 
@@ -273,9 +270,8 @@
 
 CREATE OR REPLACE VIEW exp_csv_str
-AS
- SELECT
-    l.stgml,                                             -- Filter: gml_id aus "ax_lagebezeichnungkatalogeintrag"
-                                                         -- UNTERSCHIED zu exp_csv
-    l.fall,                                              -- mit/ohne Hausnummer zur Lage
+AS      -- Version mit 4fach-UNION (2x2 FÃ€lle) statt eingebauter View "flst_an_strasse"
+ SELECT -- Fall 1: einfache Buchung (ohne Recht an)  // Lagebezeichnung MIT Hausnummer
+    sm.gml_id                            AS stgml,       -- Filter: gml_id der StraÃe aus "ax_lagebezeichnungkatalogeintrag"
+    'm'                                  AS fall,        -- SÃ€tze unterschieden: MIT HsNr
   -- F l u r s t ÃŒ c k
     f.gml_id                             AS fsgml,       -- mÃ¶glicher Filter FlurstÃŒcks-GML-ID
@@ -312,11 +308,14 @@
   -- A d r e s s e  der Person
     a.postleitzahlpostzustellung         AS plz,
-    a.ort_post                           AS ort,         -- Anschreifenzeile 1: PLZ+Ort
+    a.ort_post                           AS ort,         -- Anschriftenzeile 1: PLZ+Ort
     a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: StraÃe+HsNr
     a.bestimmungsland                    AS land
   FROM ax_flurstueck    f               -- FlurstÃŒck
-  JOIN flst_an_strasse  l               -- Lage (hier zusÃ€tzlicher JOIN gegenÃŒber Version "exp_csv") 
-    ON l.fsgml = f.gml_id               -- ToDo: ++ Durch UNION ersetzen! Oder durch Subquery? ++
-  JOIN ax_gemarkung g                   -- entschlÃŒsseln
+  -- FlurstÃŒck >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
+  JOIN ax_lagebezeichnungmithausnummer lm -- Lage MIT
+    ON lm.gml_id = ANY (f.weistauf)
+  JOIN ax_lagebezeichnungkatalogeintrag sm
+   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 
+   JOIN ax_gemarkung g                   -- entschlÃŒsseln
     ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
   JOIN ax_buchungsstelle s              -- FS >istGebucht> Buchungstelle
@@ -330,6 +329,6 @@
   JOIN ax_person p                      -- NamNum >benennt> Person 
     ON p.gml_id = nn.benennt
-  LEFT JOIN ax_anschrift a 
-    ON a.gml_id = ANY (p.hat)
+  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
+    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)
   -- E n t s c h l ÃŒ s s e l n:
   LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
@@ -354,10 +353,11 @@
       WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
    ON rg.gml_id = gb.gml_id  -- zum GB
-  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
-UNION
- SELECT
-    l.stgml,                                             -- Filter: gml_id aus "ax_lagebezeichnungkatalogeintrag"
-                                                         -- UNTERSCHIED zu exp_csv
-    l.fall,                                              -- mit/ohne Hausnummer zur Lage
+  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  
+---------
+  UNION
+---------
+ SELECT -- Fall 2: 2 Buchungs-Stellen (Recht An)  //  Lagebezeichnung MIT Hausnummer
+    sm.gml_id                            AS stgml,       -- Filter: gml_id der StraÃe aus "ax_lagebezeichnungkatalogeintrag"
+    'm'                                  AS fall,        -- SÃ€tze unterschieden: MIT HsNr
   -- F l u r s t ÃŒ c k
     f.gml_id                             AS fsgml,       -- mÃ¶glicher Filter FlurstÃŒcks-GML-ID
@@ -394,10 +394,13 @@
    -- A d r e s s e  der Person
     a.postleitzahlpostzustellung         AS plz,
-    a.ort_post                           AS ort,         -- Anschreifenzeile 1: PLZ+Ort
+    a.ort_post                           AS ort,         -- Anschriftenzeile 1: PLZ+Ort
     a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: StraÃe+HsNr
     a.bestimmungsland                    AS land
   FROM ax_flurstueck f                  -- FlurstÃŒck
-  JOIN flst_an_strasse  l               -- Lage (hier zusÃ€tzlicher JOIN gegenÃŒber Version "exp_csv") 
-    ON l.fsgml = f.gml_id 
+  -- FlurstÃŒck >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
+  JOIN ax_lagebezeichnungmithausnummer lm  -- Lage MIT
+    ON lm.gml_id = ANY (f.weistauf)
+  JOIN ax_lagebezeichnungkatalogeintrag sm
+    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 
   JOIN ax_gemarkung g                   -- entschlÃŒsseln
     ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
@@ -416,6 +419,6 @@
   JOIN ax_person p                      -- NamNum >benennt> Person 
     ON p.gml_id = nn.benennt
-  LEFT JOIN ax_anschrift a 
-    ON a.gml_id = ANY (p.hat)
+  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
+    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)
   -- E n t s c h l ÃŒ s s e l n:
   LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
@@ -435,5 +438,176 @@
    ON rg.gml_id = gb.gml_id  -- zum GB
   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 dien.endet IS NULL
+    AND dien.endet IS NULL AND lm.endet IS NULL  
+---------
+  UNION
+---------
+ SELECT -- Fall 3: einfache Buchung (ohne Recht an)  //  Lagebezeichnung OHNE Hausnummer
+    so.gml_id                            AS stgml,       -- Filter: gml_id der StraÃe aus "ax_lagebezeichnungkatalogeintrag"
+    'o'                                  AS fall,        -- SÃ€tze unterschieden: OHNE HsNr
+  -- F l u r s t ÃŒ c k
+    f.gml_id                             AS fsgml,       -- mÃ¶glicher Filter FlurstÃŒcks-GML-ID
+    f.flurstueckskennzeichen             AS fs_kennz,
+    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
+    f.flurnummer, f.zaehler, f.nenner, 
+    f.amtlicheflaeche                    AS fs_flae,
+    g.bezeichnung                        AS gemarkung,
+  -- G r u n d b u c h
+  --gb.gml_id                            AS gbgml,       -- mÃ¶glicher Filter Grundbuch-GML-ID
+    gb.bezirk                            AS gb_bezirk,
+    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
+    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
+  -- B u c h u n g s s t e l l e  (GrundstÃŒck)
+    s.laufendenummer                     AS bu_lfd,      -- BVNR
+    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
+    s.buchungsart,                                       -- verschlÃŒsselt
+    wb.v                                 AS bu_art,      -- Buchungsart entschlÃŒsselt
+  -- N a m e n s N u m m e r  (Normalfall mit Person)
+    nn.laufendenummernachdin1421         AS nam_lfd, 
+    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
+  -- 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)
+    rg.artderrechtsgemeinschaft          AS nam_adr,
+    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
+    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
+  -- P e r s o n
+  --p.gml_id                             AS psgml,       -- mÃ¶glicher Filter Personen-GML-ID
+    p.anrede,                                            -- Anrede key
+    wp.v                                 AS anrv,        -- Anrede Value zum Key
+    p.vorname,
+    p.namensbestandteil,
+    p.nachnameoderfirma,                                 -- Familienname
+    p.geburtsdatum,
+  -- A d r e s s e  der Person
+    a.postleitzahlpostzustellung         AS plz,
+    a.ort_post                           AS ort,         -- Anschriftenzeile 1: PLZ+Ort
+    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: StraÃe+HsNr
+    a.bestimmungsland                    AS land
+  FROM ax_flurstueck    f               -- FlurstÃŒck
+-- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
+  JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
+    ON lo.gml_id = ANY (f.zeigtauf)
+  JOIN ax_lagebezeichnungkatalogeintrag so -- StraÃe OHNE
+    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
+  JOIN ax_gemarkung g                   -- entschlÃŒsseln
+    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
+  JOIN ax_buchungsstelle s              -- FS >istGebucht> Buchungstelle
+    ON f.istgebucht = s.gml_id
+  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
+    ON gb.gml_id = s.istbestandteilvon
+  JOIN ax_buchungsblattbezirk z 
+    ON gb.land=z.land AND gb.bezirk=z.bezirk 
+  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
+    ON gb.gml_id = nn.istbestandteilvon
+  JOIN ax_person p                      -- NamNum >benennt> Person 
+    ON p.gml_id = nn.benennt
+  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
+    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)
+  -- E n t s c h l ÃŒ s s e l n:
+  LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
+    ON cast(p.anrede AS character varying) = wp.k 
+   AND wp.element = 'ax_person' 
+   AND wp.bezeichnung = 'anrede' 
+  LEFT JOIN alkis_wertearten wb         -- EntschlÃŒsseln "Buchungsart"
+    ON cast(s.buchungsart AS character varying) = wb.k
+ -- buchungsart = integer / .k  = char 4stellig
+   AND wb.element = 'ax_buchungsstelle'
+   AND wb.bezeichnung = 'buchungsart' 
+  -- 2mal "LEFT JOIN" verdoppelt die Zeile in der Ausgabe. Darum als Subquery in Spalten packen:
+  -- Noch mal "GB -> NamNum", aber dieses Mal fÃŒr "Rechtsgemeinschaft".
+  -- Kommt max. 1 mal je GB vor und hat keine Relation auf Person.
+  LEFT JOIN
+   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
+       FROM ax_namensnummer r 
+       JOIN ax_buchungsblatt gr
+         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 
+      LEFT JOIN alkis_wertearten wr
+        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft' 
+      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
+   ON rg.gml_id = gb.gml_id  -- zum GB
+  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 
+---------
+  UNION
+---------
+ SELECT -- Fall 4: 2 Buchungs-Stellen (Recht An)  //  Lagebezeichnung OHNE Hausnummer
+    so.gml_id                            AS stgml,       -- Filter: gml_id der StraÃe aus "ax_lagebezeichnungkatalogeintrag"
+    'o'                                  AS fall,        -- SÃ€tze unterschieden: OHNE HsNr
+  -- F l u r s t ÃŒ c k
+    f.gml_id                             AS fsgml,       -- mÃ¶glicher Filter FlurstÃŒcks-GML-ID
+    f.flurstueckskennzeichen             AS fs_kennz,
+    f.gemarkungsnummer,                                  -- Teile des FS-Kennz. noch mal einzeln
+    f.flurnummer, f.zaehler, f.nenner, 
+    f.amtlicheflaeche                    AS fs_flae,
+    g.bezeichnung                        AS gemarkung,
+  -- G r u n d b u c h
+  --gb.gml_id                            AS gbgml,       -- mÃ¶glicher Filter Grundbuch-GML-ID
+    gb.bezirk                            AS gb_bezirk,
+    gb.buchungsblattnummermitbuchstabenerweiterung AS gb_blatt,
+    z.bezeichnung                        AS beznam,      -- GB-Bezirks-Name
+  -- B u c h u n g s s t e l l e  (GrundstÃŒck)
+    s.laufendenummer                     AS bu_lfd,      -- BVNR
+    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN ÃŒber 'Recht an')
+    s.buchungsart,                                       -- verschlÃŒsselt
+    wb.v                                 AS bu_art,      -- Buchungsart entschlÃŒsselt
+  -- N a m e n s N u m m e r  (Normalfall mit Person)
+    nn.laufendenummernachdin1421         AS nam_lfd, 
+    '=' || nn.zaehler|| '/' || nn.nenner AS nam_ant,     -- als Excel-Formel
+  -- 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)
+    rg.artderrechtsgemeinschaft          AS nam_adr,
+    rg.v                                 AS nam_adrv,    -- Art der Rechtsgem. - Value zum Key
+    rg.beschriebderrechtsgemeinschaft    AS nam_bes,
+  -- P e r s o n
+  --p.gml_id                             AS psgml,       -- mÃ¶glicher Filter Personen-GML-ID
+    p.anrede,                                            -- Anrede key
+    wp.v                                 AS anrv,        -- Anrede Value zum Key
+    p.vorname,
+    p.namensbestandteil,
+    p.nachnameoderfirma,                                 -- Familienname
+    p.geburtsdatum,
+   -- A d r e s s e  der Person
+    a.postleitzahlpostzustellung         AS plz,
+    a.ort_post                           AS ort,         -- Anschriftenzeile 1: PLZ+Ort
+    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: StraÃe+HsNr
+    a.bestimmungsland                    AS land
+  FROM ax_flurstueck f                  -- FlurstÃŒck
+-- FlurstÃŒck >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
+  JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
+    ON lo.gml_id = ANY (f.zeigtauf)
+  JOIN ax_lagebezeichnungkatalogeintrag so -- StraÃe OHNE
+    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
+  JOIN ax_gemarkung g                   -- entschlÃŒsseln
+    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
+  -- FS >istGebucht> Buchungstelle  <an<  Buchungstelle
+ -- Variante mit 2 Buchungs-Stellen (Recht An)
+  JOIN ax_buchungsstelle dien           -- dienende Buchung
+    ON f.istgebucht = dien.gml_id
+  JOIN ax_buchungsstelle s              -- herrschende Buchung
+    ON dien.gml_id = ANY (s.an)         -- hat Recht an
+  JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
+    ON gb.gml_id = s.istbestandteilvon
+  JOIN ax_buchungsblattbezirk z 
+    ON gb.land=z.land AND gb.bezirk=z.bezirk 
+  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
+    ON gb.gml_id = nn.istbestandteilvon
+  JOIN ax_person p                      -- NamNum >benennt> Person 
+    ON p.gml_id = nn.benennt
+  LEFT JOIN ax_anschrift a              -- nur die "letzte" Anschrift zur Person verwenden
+    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)
+  -- E n t s c h l ÃŒ s s e l n:
+  LEFT JOIN alkis_wertearten wp         -- EntschlÃŒsseln "Person - Anrede"
+    ON cast(p.anrede AS character varying)=wp.k AND wp.element='ax_person' AND wp.bezeichnung='anrede' 
+  LEFT JOIN alkis_wertearten wb         -- EntschlÃŒsseln "Buchungsart"
+    ON cast(s.buchungsart AS character varying) = wb.k 
+   AND wb.element = 'ax_buchungsstelle' 
+   AND wb.bezeichnung = 'buchungsart' 
+  LEFT JOIN
+   ( SELECT gr.gml_id, r.artderrechtsgemeinschaft, r.beschriebderrechtsgemeinschaft, wr.v
+       FROM ax_namensnummer r 
+       JOIN ax_buchungsblatt gr
+         ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 
+      LEFT JOIN alkis_wertearten wr
+        ON cast(r.artderrechtsgemeinschaft AS character varying)=wr.k AND wr.element='ax_namensnummer' AND wr.bezeichnung='artderrechtsgemeinschaft' 
+      WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
+   ON rg.gml_id = gb.gml_id  -- zum GB
+  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 dien.endet IS NULL AND lo.endet IS NULL 
 
 ORDER BY fs_kennz,   -- f.flurstueckskennzeichen, 
@@ -447,8 +621,6 @@
 
 
--- Berechtigung fuer Views
--- ============================
-
-  GRANT SELECT ON TABLE public.flst_an_strasse  TO mb27;
+-- Berechtigung
+-- ============
   GRANT SELECT ON TABLE public.exp_csv          TO mb27;
   GRANT SELECT ON TABLE public.exp_csv_str      TO mb27;
