
-- ===================================================================================
--  ALKIS-PostGIS   Mapbender-Navigation und Buchauskunft für NorGIS-ALKIS-Importer
-- ===================================================================================

--Stand 
--  2016-02-23
--  2016-11-24 Index auf ax.person.nachnameoderfirma für WMS Flurstuecke_kommunal
--  2016-12-01 exp_csv: Fehlerkorrektur bei Entschlüsselung der Buchungsart
--             Optimierte Version (ohne Doppelverbindung)

-- ToDo: Auch den View "flst_an_strasse" möglist nicht in andere Views einbinden.
--       Dafür die gesamte Struktur als UNION-View.

-- Aufgabe:
--
-- Die ALKIS-Navigation für Mapbender 2.7.4 arbeitet bisher mit der Datenbank-Struktur
-- aus dem "Klassischen" Import mit Aufruf des Konvertres ogr2ogr aus einen Shellscript.
--
-- Dabei wird ein PostProcessing (Nach-Konverter-Verarbeitung) durchgeführt,
-- das Tabellen und Views bereit stellt, für einen schnellen Zugriff in 
--  Mapfile, Auskunft und Navigation. 
--
-- Dies Script soll eine Datenbank, die mit dem NorGIS-ALKIS-Importer geladen wurde
-- für die Verwendung mit ALKIS-Navigation und Buchauskunft vorbereiten. 
-- Es ist jedoch eine speziell angepasste Version der NAV-PHP-Scripte notwendig. 

-- Alternative: 
--  Die bisher auch in der NAV verwendeten Tabellen "pp_flur", "pp_gemarkung", "pp_gemeinde"
--  werden auch für eine "Übersichtskarte" benötigt (Gruppe "Gebiete" im Classic-Mapfile). 
--  Um diese zu bekommen müsste dieser Teil des klassischen Post-Processing auch in der 
--  NorGIS-Version ausgeführt würde.
--  Siehe Script: "pp_gebiete.sql" (Füllen) und Teile von "pp_definition.sql" (DB-Struktur).


-- T e s t  /  A n a l y s e
-- ============================
/*

-- Änderungswünsche an der norGIS-ALKIS-Importer Datenbankstruktur
-- -----------------------------------------------------------------

1.
In den ALKIS-Tabellen "ax_historischesflurstueck" und "ax_historischesflurstueckohneraumbezug" sollten
die Spalten "zaehler" und "nenner" das Format Integer statt Character haben.
Beim Anzeigen wird eine "numerische" Sortierung erwartet (aufsteigende FS-Nummer).
Da die Spalten linksbündig ohne führende Nullen gefüllt sind muss man bei jeder Abfrage eine 
Typenumwandlung "cast(.. AS integer)" durchführen um eine numerische Sortierung zu bekommen.

2.
In den PostProcessing-Tabellen "gem_shl" und "gema_shl" sollten die Spalten als "character varying"
definiert sein und NICHT mit Leerzeichen aufgefüllt werden.
Derzeit muss man bei der Suche und Anzeige immer mit Subsring- und Trim-Funktionen arbeiten. 

3.
Die Gemarkungsnummer sollte einheitlich ohne vorangestelltes "Land" verwendet werden.
In den ALKIS-Tabellen ist i.d.R. die Gemarkungsnummer 4stellig enthalten und land (2) in einem weiteren Feld.
(ax_gemarkungsteilflur.gemarkung integer, ax_gemarkung.gemarkungsnummer character varying,
 ax_flurstueck.gemarkungsnummer character varying, usw. ..)
In den Hilfstabellen wie "gema_shl.gemashl" wird Gemarkung aber 6stellig mit "land" davor gespeichert.
Man muss in den Programmen dann mal das Land hinzufügen und mal abschneiden. 
*/


-- D a t e n 
-- ============================

-- Die "Beziehungen" werden immer noch mit geladen, sind aber inzwischen überflüssig,
-- weil jetzt Relationen zwischen den Tabellen definiert sind. 
  TRUNCATE alkis_beziehungen;


-- T a b e l l e n
-- ============================

-- "pp_gemeinde" ersetzen
-- ------------------------
-- "pp_gemeinde" ist eine optimierte Tabelle der Gemeinden aus dem Post-Processing der Classic-Variante.
-- In der NAV eErsetzen durch:

-- TABLE gem_shl (
--  gemshl character(32) NOT NULL,  -- Gemeindeschlüssel z.B. '05766040' = Lage
--                                     Achtung: hinten mit Leerzeichen aufgefüllt!!
--  gemname character(100),         -- Name


-- "pp_gemarkung" ersetzen
-- ----------------------------
-- "pp_gemarkung" ist eine optimierte Tabelle der Gemarkungen aus dem Post-Processing der Classic-Variante.
-- In der NAV eErsetzen durch:

-- TABLE gema_shl (
--  gemashl character(6) NOT NULL,  -- Gemarkungsschlüssel z.B. '052005' = Lage
--  gemarkung character(50),        -- Name
--  gemshl character(30),           -- Gemeindeschlüssel z.B. '05766040' = Lage  oder leer
--                                     Achtung: hinten mit Leerzeichen aufgefüllt!!
--  ag_shl character(4),            -- ?? leer


-- "pp_flur" ersetzen
-- -------------------
-- "pp_flur" ist eine optimierte Tabelle der Katasterfluren aus dem Post-Processing der Classic-Variante.
-- In der NAV eErsetzen durch:

-- TABLE ax_gemarkungsteilflur (
--  gml_id character(16) NOT NULL, -- Identifikator, global eindeutig
--  endet character(20),
--  schluesselgesamt character varying, -- (DER) SCH[CharacterString] 'Schlüssel (gesamt)'   LLGGGFFF  Land-Gemerkung-Flur
--  bezeichnung character varying, -- BEZ[CharacterString] 'Bezeichnung'  FFF  FLurnummer mit führenden Nullen
--  land character varying, -- LAN[CharacterString] Bundesland. LL '05'
--  gemarkung integer, -- GMN[CharacterString] Gemarkung.  GGGG 
--  gemarkungsteilflur integer, -- FLR[CharacterString] Gemarkungsteil bzw. Flur.


-- Tabelle "gemeinde_person" ersetzen
-- -----------------------------------
--


-- 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]") 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;
CREATE INDEX ax_person_nname
  ON ax_person USING btree (nachnameoderfirma COLLATE pg_catalog."default");


-- V i e w s
-- ============================


-- Bausteine für andere Views:
-- ---------------------------

-- Ein View, der die Verbindung von Flurstück zur Buchung für zwei verschiedene Fälle herstellt.
-- Einmal die "normalen" (direkten) Buchungen.
-- Zweitens über die Rechte von Buchungsstellen an anderen Buchungsstellen.
-- Dies kann als "Mittelstück" in den anderen Views eingefügt werden.

-- Einfach/Direkt:
--   Flurstück   >istGebucht>                         (Buchungs-Stelle)
--
-- Mit "Recht an":
--   Flurstück   >istGebucht>  Buchungs-Stelle  <an<  (Buchungs-Stelle)
--                               (dienend)              (herrschend) 

-- Stand 2016-12-01:
--	Dieser View "doppelverbindung", eingebettet in andere Views, hat sich bei der Ausführungszeit
--	als nicht optimal heraus gestellt.
--	Der äußere "View" sieht einfacher aus und ist besser zu verstehen.
--	Wenn man den ganzen äußeren View als UNION formuliert, dann ist das zwar viel mehr Code.
--	Die Ausführungszeit ist aber deutlich kürzer.

--           DROP VIEW public.doppelverbindung;
CREATE OR REPLACE VIEW public.doppelverbindung
AS
  -- FS >istGebucht> Buchungstelle
  SELECT f1.gml_id              AS fsgml,    -- gml_id Flurstück
         b1.gml_id              AS bsgml,    -- gml_id Buchungs
         0                      AS ba_dien
    FROM ax_flurstueck f1
    JOIN ax_buchungsstelle b1   ON f1.istgebucht = b1.gml_id
 UNION
  -- FS >istGebucht> Buchungstelle  <an<  Buchungstelle
  SELECT f2.gml_id              AS fsgml,    -- gml_id Flurstück
         b2.gml_id              AS bsgml,    -- gml_id Buchung - (herrschendes GB)
         dien.buchungsart       AS ba_dien   -- Ein Feld aus der Zwischen-Buchung zur Fall-Unterscheidung
    FROM ax_flurstueck f2
    JOIN ax_buchungsstelle dien ON f2.istgebucht = dien.gml_id
    JOIN ax_buchungsstelle b2   ON dien.gml_id = ANY (b2.an)  -- auch "zu" ?
   WHERE dien.endet IS NULL;   -- Für das zusätzliche Verbindungselement die Historie HIER ausschließen, 
                               -- Für andere Tabellen muss dies in dem View erfolgen, der dies verwendet.

COMMENT ON VIEW public.doppelverbindung 
 IS 'ALKIS-Beziehung von Flurstück zu Buchung. UNION-Zusammenfassung des einfachen Falls mit direkter Buchung und des Falles mit Recht einer Buchungsstelle an einer anderen Buchungsstelle.
Dies ist ausschließlich gedacht zur Verwendung in anderen Views um diese einfacher zu machen.';


-- 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;
CREATE OR REPLACE VIEW public.flst_an_strasse
AS
  -- Flurstück >weistAuf> ax_lagebezeichnungMIThausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
  SELECT fm.gml_id AS fsgml,
         sm.gml_id AS stgml,                 -- Filter: gml_id der Straße
         'm' AS fall                         -- Sätze unterschieden: Mit HsNr
    FROM ax_flurstueck fm                    -- Flurstück Mit
    JOIN ax_lagebezeichnungmithausnummer lm  -- Lage MIT
      ON lm.gml_id = ANY (fm.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 
   WHERE lm.endet IS NULL AND fm.endet IS NULL -- nichts Historisches
 UNION
  -- Flurstück >zeigtAuf> ax_lagebezeichnungOHNEhausnummer <JOIN> ax_lagebezeichnungkatalogeintrag
  SELECT fo.gml_id AS fsgml,
         so.gml_id AS stgml,                 -- Filter: gml_id der Straße
         'o' AS fall                         -- Sätze unterschieden: Ohne HsNr
    FROM ax_flurstueck fo                    -- Flurstück OHNE
    JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
      ON lo.gml_id = ANY (fo.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
   WHERE lo.endet IS NULL AND fo.endet IS NULL; -- nichts Historisches

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?


-- Generelle Export-Struktur "Flurstück - Buchung - Grundbuch - Person"
-- --------------------------------------------------------------------
-- Wird benötigt im Auskunft-Modul "alkisexport.php":
-- Je nach aufrufendem Modul wird der Filter (WHERE) an anderer Stelle gesetzt (gml_id von FS, GB oder Pers.)
-- Für Filter nach "Straße" siehe die nachfolgende Sonderversion "exp_csv_str".

-- Problem / Konflikt:
-- Es kann nur eine lineare Struktur aus Spalten und Zeilen exportiert werden. 
-- Wenn nicht nur die Daten des Ausgangs-Objektes exportiert werden, sondern auch verbundene Tabellen in 
-- einer 1:N-Struktur, dann verdoppeln sich Zeileninhalte und es werden redundante Daten erzeugt. 
-- Diese Redundanzen müssen vom dem Programm gefiltert werden, das die Daten über eine Schnittstelle einliest.
-- Anwendungs-Beispiel: Abrechnung von Anliegerbeiträgen.

/*
DROP VIEW IF EXISTS exp_csv_alt;
CREATE OR REPLACE VIEW exp_csv_alt
AS
 SELECT
  -- 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,                                 -- Anteil des GB am FS, einzelne Felder
    '=' || s.zaehler || '/' || s.nenner  AS bu_ant,      -- als Excel-Formel (nur bei Wohnungsgrundbuch JOIN über 'Recht an')
    s.buchungsart,                                       -- verschlüsselt
  --b.bezeichner                         AS bu_art,      -- Buchungsart entschlü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)
  -- Aus Subquery rg
    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,
    --p.geburtsname, p.akademischergrad 
   -- A d r e s s e  der Person
    a.postleitzahlpostzustellung         AS plz,
    a.ort_post                           AS ort,             -- Anschreifenzeile 1: PLZ+Ort
    a.strasse,  a.hausnummer,                                -- Anschriftenzeile 2: Straße+HsNr
    a.bestimmungsland                    AS land
  FROM ax_flurstueck    f               -- Flurstück
  JOIN doppelverbindung d               -- beide Fälle über Union-View: direkt und über Recht von Buchung an Buchung
    ON d.fsgml = f.gml_id
  JOIN ax_gemarkung g                   -- entschlüsseln
    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
  JOIN ax_buchungsstelle s              -- Buchungs-Stelle
    ON d.bsgml = 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 
    ON a.gml_id = ANY (p.hat)
  -- 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' 
  -- 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
  ORDER BY f.flurstueckskennzeichen, 
           gb.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, s.laufendenummer,
           nn.laufendenummernachdin1421;

COMMENT ON VIEW exp_csv_alt 
 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.
ALTE VERSION unter Verwendung von "doppelverbindung". Zu langsam!!';
*/

-- OPTIMIERUNG 2016-11-30:
-- Eine Variante, die ohne "doppelverbindung" auskommt. Das ist optimaler (schneller, Faktor 50!).
-- Das in "doppelverbindung" enthaltene UNION auf die gesamte Struktur anwenden.
-- Verbindungs-Tabellen zwischen "doppelverbindung" und den benachbarten Tabellen sind nur einmal enthalten.
DROP VIEW IF EXISTS exp_csv;

CREATE OR REPLACE VIEW exp_csv
AS
 SELECT
  -- 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,         -- Anschreifenzeile 1: PLZ+Ort
    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
    a.bestimmungsland                    AS land
  FROM ax_flurstueck    f               -- Flurstück
  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 
    ON a.gml_id = ANY (p.hat)
  -- 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
UNION
 SELECT
  -- 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,         -- Anschreifenzeile 1: PLZ+Ort
    a.strasse,  a.hausnummer,                            -- Anschriftenzeile 2: Straße+HsNr
    a.bestimmungsland                    AS land
  FROM ax_flurstueck f                  -- Flurstück
  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 
    ON a.gml_id = ANY (p.hat)
  -- 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

ORDER BY fsgml,      -- f.flurstueckskennzeichen, 
         gb_bezirk,  -- gb.bezirk, 
         gb_blatt,   -- gb.buchungsblattnummermitbuchstabenerweiterung,
         bu_lfd,     -- s.laufendenummer,
         nam_lfd;    -- nn.laufendenummernachdin1421

COMMENT ON VIEW exp_csv 
 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.';


-- 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
-- um alle Flurstücke zu bekommen, die an einer Straße liegen.

/*
DROP VIEW IF EXISTS exp_csv_str_alt;
CREATE OR REPLACE VIEW exp_csv_str_alt
AS
 SELECT
    l.stgml,                                             -- Filter: gml_id aus "ax_lagebezeichnungkatalogeintrag"
                                                         -- UNTERSCHIED zu exp_csv)
  -- F l u r s t ü c k
    f.gml_id                             AS fsgml,       -- Gruppenwechsel für "function lage_zum_fs" in alkisexport.php
    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,                                 -- Anteil des GB am FS, einzelne Felder
    '=' || 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)
  -- Aus Subquery rg
    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,
    --p.geburtsname, p.akademischergrad 
   -- 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
  JOIN flst_an_strasse  l               -- Lage (hier zusätzlicher JOIN gegenüber Version "exp_csv") 
	ON l.fsgml = f.gml_id 
  JOIN doppelverbindung d               -- beide Fälle über Union-View: direkt und über Recht von Buchung an Buchung
    ON d.fsgml = f.gml_id 
  JOIN ax_gemarkung g                   -- entschlüsseln
    ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
  JOIN ax_buchungsstelle s              -- Buchungs-Stelle
    ON d.bsgml = 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 
    ON a.gml_id = ANY (p.hat)
  -- 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 wp.element='ax_buchungsstelle' AND wp.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
  ORDER BY f.flurstueckskennzeichen, 
           gb.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, s.laufendenummer,
           nn.laufendenummernachdin1421;

COMMENT ON VIEW exp_csv_str_alt 
 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.';
*/

-- 2016-12-01: Neue schnellere Version unter Vermeidung von "doppelverbindung":
--		Etwa um den Faktor 2,5 schneller als die alte Version

-- ToDo: Den View "flst_an_strasse" möglichst auch nicht im Views verwenden.
--       Ist 4-fach-Union schneller ??

DROP VIEW IF EXISTS exp_csv_str;

CREATE OR REPLACE VIEW exp_csv_str
AS
 SELECT
    l.stgml,                                             -- Filter: gml_id aus "ax_lagebezeichnungkatalogeintrag"
                                                         -- UNTERSCHIED zu exp_csv
  -- 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,         -- Anschreifenzeile 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
    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 
    ON a.gml_id = ANY (p.hat)
  -- 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
UNION
 SELECT
    l.stgml,                                             -- Filter: gml_id aus "ax_lagebezeichnungkatalogeintrag"
                                                         -- UNTERSCHIED zu exp_csv
  -- 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,         -- Anschreifenzeile 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 
  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 
    ON a.gml_id = ANY (p.hat)
  -- 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

ORDER BY fsgml,      -- f.flurstueckskennzeichen, 
         gb_bezirk,  -- gb.bezirk, 
         gb_blatt,   -- gb.buchungsblattnummermitbuchstabenerweiterung,
         bu_lfd,     -- s.laufendenummer,
         nam_lfd;    -- nn.laufendenummernachdin1421

COMMENT ON VIEW exp_csv_str 
 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.';


-- B e r e c h t i g u n g e n
-- ============================
-- Analog "grant.sql"
-- Die ALKIS-Navigation für Mapbender 2.7 und die Buchauskunft verwendet den DB-User "mb27"

-- Tabellen der ALKIS-Struktur
-- -----------------------------------------------------------------------

  GRANT SELECT ON TABLE public.ap_pto TO mb27;

  GRANT SELECT ON TABLE public.ax_anschrift TO mb27;
  GRANT SELECT ON TABLE public.ax_bauraumoderbodenordnungsrecht TO mb27;
  GRANT SELECT ON TABLE public.ax_besondereflurstuecksgrenze TO mb27;
  GRANT SELECT ON TABLE public.ax_buchungsblatt TO mb27;
  GRANT SELECT ON TABLE public.ax_buchungsblattbezirk TO mb27;
  GRANT SELECT ON TABLE public.ax_buchungsstelle TO mb27;
  GRANT SELECT ON TABLE public.ax_bundesland TO mb27;
  GRANT SELECT ON TABLE public.ax_dienststelle TO mb27;
  GRANT SELECT ON TABLE public.ax_flurstueck TO mb27;
  GRANT SELECT ON TABLE public.ax_gebaeude TO mb27;
  GRANT SELECT ON TABLE public.ax_gemarkung TO mb27;
  GRANT SELECT ON TABLE public.ax_gemarkungsteilflur TO mb27;
  GRANT SELECT ON TABLE public.ax_gemeinde TO mb27;
  GRANT SELECT ON TABLE public.ax_historischesflurstueck TO mb27;
  GRANT SELECT ON TABLE public.ax_historischesflurstueckohneraumbezug TO mb27;
  GRANT SELECT ON TABLE public.ax_kreisregion TO mb27;
  GRANT SELECT ON TABLE public.ax_lagebezeichnungkatalogeintrag TO mb27;
  GRANT SELECT ON TABLE public.ax_lagebezeichnungmithausnummer TO mb27;
  GRANT SELECT ON TABLE public.ax_lagebezeichnungmitpseudonummer TO mb27;
  GRANT SELECT ON TABLE public.ax_lagebezeichnungohnehausnummer TO mb27;
  GRANT SELECT ON TABLE public.ax_namensnummer TO mb27;
  GRANT SELECT ON TABLE public.ax_person TO mb27;
  GRANT SELECT ON TABLE public.ax_regierungsbezirk TO mb27;

-- Tabellen der norGIS-Metadaten (Ersatz für Schlüssel-Tabellen )
-- -----------------------------------------------------------------------

  GRANT SELECT ON TABLE public.alkis_elemente   TO mb27;
  GRANT SELECT ON TABLE public.alkis_wertearten TO mb27;

-- Tabellen des norGIS-PostProcessing  (Ersatz Classic-Post-Processing)
-- -----------------------------------------------------------------------
  -- Dies muss nach einer Datenbank-Aktualisierung neu berechtigt werden
  GRANT SELECT ON TABLE public.gem_shl  TO mb27;
  GRANT SELECT ON TABLE public.gema_shl TO mb27;
  GRANT SELECT ON TABLE public.nutz_21  TO mb27;
  GRANT SELECT ON TABLE public.nutz_shl TO mb27;

-- Views in der norGIS-Struktur, die Schlüssel-Tabellen ersetzen
-- -----------------------------------------------------------------------
--  Diese Views werden nicht verwendet. 
--  Es wird jeweils direkt die Tabelle "alkis_wertearten" benutzt.

--GRANT SELECT ON TABLE public.v_andstrass_adf TO mb27;
--GRANT SELECT ON TABLE public.v_baurecht_adf TO mb27;
--GRANT SELECT ON TABLE public.v_bauteil_bauart TO mb27;
--GRANT SELECT ON TABLE public.v_bewertg_klass TO mb27;
--GRANT SELECT ON TABLE public.v_bs_buchungsart TO mb27;
--GRANT SELECT ON TABLE public.v_bschaetz_bodenart TO mb27;
--GRANT SELECT ON TABLE public.v_bschaetz_entsteh_klima TO mb27;
--GRANT SELECT ON TABLE public.v_bschaetz_kulturart TO mb27;
--GRANT SELECT ON TABLE public.v_bschaetz_sonst TO mb27;
--GRANT SELECT ON TABLE public.v_bschaetz_zustandsstufe TO mb27;
--GRANT SELECT ON TABLE public.v_datenerhebung TO mb27;
--GRANT SELECT ON TABLE public.v_denkmal_adf TO mb27;
--GRANT SELECT ON TABLE public.v_forstrecht_adf TO mb27;
--GRANT SELECT ON TABLE public.v_forstrecht_besfkt TO mb27;
--GRANT SELECT ON TABLE public.v_geb_bauweise TO mb27;
--GRANT SELECT ON TABLE public.v_geb_dachform TO mb27;
--GRANT SELECT ON TABLE public.v_geb_dachgeschossausbau TO mb27;
--GRANT SELECT ON TABLE public.v_geb_funktion TO mb27;
--GRANT SELECT ON TABLE public.v_geb_lagezeo TO mb27;
--GRANT SELECT ON TABLE public.v_geb_weiterefkt TO mb27;
--GRANT SELECT ON TABLE public.v_geb_zustand TO mb27;
--GRANT SELECT ON TABLE public.v_grabloch_bedeutg TO mb27;
--GRANT SELECT ON TABLE public.v_haeuser TO mb27;
--GRANT SELECT ON TABLE public.v_klass_strass_adf TO mb27;
--GRANT SELECT ON TABLE public.v_klass_wasser_adf TO mb27;
--GRANT SELECT ON TABLE public.v_muster_merkmal TO mb27;
--GRANT SELECT ON TABLE public.v_namnum_eigart TO mb27;
--GRANT SELECT ON TABLE public.v_sbauwerk_bwfkt TO mb27;
--GRANT SELECT ON TABLE public.v_sonstrecht_adf TO mb27;
--GRANT SELECT ON TABLE public.v_umweltrecht_adf TO mb27;


-- Berechtigung fuer Views
-- -----------------------------------------------------------------------

  -- Bausteine für andere Views
  GRANT SELECT ON TABLE public.doppelverbindung TO mb27;
  GRANT SELECT ON TABLE public.flst_an_strasse  TO mb27;

  -- alkis_export als CSV
  GRANT SELECT ON TABLE public.exp_csv     TO mb27;
  GRANT SELECT ON TABLE public.exp_csv_str TO mb27;

-- Ende --