Index: /trunk/import/sichten.sql
===================================================================
--- /trunk/import/sichten.sql	(revision 362)
+++ /trunk/import/sichten.sql	(revision 363)
@@ -38,4 +38,5 @@
 --  2014-09-30 Umbenennung SchlÃŒsseltabellen (Prefix)
 --  2015-03-19 View "suche_grosse_gb_bestaende"
+--  2016-03-01 bereits auskommentierte-Substring-JOIN entfernt, neuer View "fehlersuche_nba_person"
 
 -- Bausteine fÃŒr andere Views:
@@ -62,5 +63,4 @@
          0                      AS ba_dien
     FROM ax_flurstueck f1
-  --JOIN ax_buchungsstelle b1   ON f1.istgebucht = substring(b1.gml_id,1,16)
     JOIN ax_buchungsstelle b1   ON f1.istgebucht = b1.gml_id
  UNION
@@ -70,7 +70,5 @@
          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 = substring(dien.gml_id,1,16)
     JOIN ax_buchungsstelle dien ON f2.istgebucht = dien.gml_id
-  --JOIN ax_buchungsstelle b2   ON substring(dien.gml_id,1,16) = ANY (b2.an)
     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, 
@@ -99,5 +97,4 @@
     FROM ax_flurstueck fm                    -- FlurstÃŒck Mit
     JOIN ax_lagebezeichnungmithausnummer lm  -- Lage MIT
-    --ON substring(lm.gml_id,1,16) = ANY (fm.weistauf)
       ON lm.gml_id = ANY (fm.weistauf)
     JOIN ax_lagebezeichnungkatalogeintrag sm
@@ -111,5 +108,4 @@
     FROM ax_flurstueck fo                    -- FlurstÃŒck OHNE
     JOIN ax_lagebezeichnungohnehausnummer lo -- Lage OHNE
-    --ON substring(lo.gml_id,1,16) = ANY (fo.zeigtauf)
       ON lo.gml_id = ANY (fo.zeigtauf)
     JOIN ax_lagebezeichnungkatalogeintrag so -- StraÃe OHNE
@@ -203,16 +199,12 @@
     ON s.buchungsart = b.wert 
   JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
-  --ON substring(gb.gml_id,1,16) = s.istbestandteilvon
     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 substring(gb.gml_id,1,16) = nn.istbestandteilvon
     ON  gb.gml_id = nn.istbestandteilvon
   JOIN ax_person p                      -- NamNum >benennt> Person 
-  --ON substring(p.gml_id,1,16) = nn.benennt
     ON p.gml_id = nn.benennt
   LEFT JOIN ax_anschrift a 
-  --ON substring(a.gml_id,1,16) = ANY (p.hat)
     ON a.gml_id = ANY (p.hat)
 
@@ -224,5 +216,4 @@
        FROM ax_namensnummer r 
        JOIN ax_buchungsblatt gr
-       --ON r.istbestandteilvon = substring(gr.gml_id,1,16)
          ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 
       WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg -- Rechtsgemeinschaft
@@ -308,16 +299,12 @@
     ON s.buchungsart = b.wert 
   JOIN ax_buchungsblatt  gb             -- Buchung >istBestandteilVon> Grundbuchblatt
-  --ON substring(gb.gml_id,1,16) = s.istbestandteilvon
     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 substring(gb.gml_id,1,16) = nn.istbestandteilvon
     ON gb.gml_id = nn.istbestandteilvon
   JOIN ax_person p                      -- NamNum >benennt> Person 
-  --ON substring(p.gml_id,1,16) = nn.benennt
     ON p.gml_id = nn.benennt
   LEFT JOIN ax_anschrift a 
-  --ON substring(a.gml_id,1,16) = ANY (p.hat)
     ON a.gml_id = ANY (p.hat)
 
@@ -329,5 +316,4 @@
        FROM ax_namensnummer r 
        JOIN ax_buchungsblatt gr
-       --ON r.istbestandteilvon = substring(gr.gml_id,1,16)
          ON r.istbestandteilvon = gr.gml_id -- Blatt <istBestandteilVon< NamNum (Rechtsgemeinschaft) 
       WHERE NOT r.artderrechtsgemeinschaft IS NULL ) AS rg  -- Rechtsgemeinschaft
@@ -367,5 +353,4 @@
   FROM ax_buchungsblatt gb 
   JOIN ax_namensnummer  nn  
-  --ON substring(gb.gml_id,1,16) = nn.istbestandteilvon
     ON gb.gml_id = nn.istbestandteilvon
   WHERE NOT nn.artderrechtsgemeinschaft IS NULL
@@ -459,5 +444,4 @@
    FROM ax_flurstueck f 
    JOIN ap_pto p 
-   --ON substring(f.gml_id,1,16) = ANY(p.dientzurdarstellungvon)
      ON f.gml_id = ANY(p.dientzurdarstellungvon) 
   WHERE f.endet IS NULL AND p.endet IS NULL;
@@ -473,5 +457,4 @@
  FROM   ax_flurstueck f 
  LEFT JOIN ap_pto p 
- --ON substring(f.gml_id,1,16) = ANY(p.dientzurdarstellungvon)
    ON f.gml_id = ANY(p.dientzurdarstellungvon)
  WHERE p.gml_id IS NULL
@@ -588,5 +571,4 @@
            l.hausnummer 
       FROM   ax_flurstueck f 
-    --JOIN   ax_lagebezeichnungmithausnummer l   ON  substring(l.gml_id,1,16) = ANY (f.weistauf)
       JOIN   ax_lagebezeichnungmithausnummer l   ON  l.gml_id = ANY(f.weistauf)
       JOIN   ax_gemeinde g   ON l.kreis=g.kreis  AND l.gemeinde=g.gemeinde 
@@ -651,17 +633,13 @@
    FROM   ax_person              p
      JOIN ax_namensnummer        n   -- Namennummer >benennt> Person
-     --ON substring(p.gml_id,1,16) = n.benennt
        ON p.gml_id = n.benennt
      JOIN ax_buchungsblatt       g   -- Namensnummer >istBestandteilVon> Grundbuch
-     --ON n.istbestandteilvon = substring(g.gml_id,1,16)
        ON n.istbestandteilvon = g.gml_id
      JOIN ax_buchungsblattbezirk b    ON g.land = b.land AND g.bezirk = b.bezirk 
      JOIN ax_buchungsstelle      s   -- Buchungs-Stelle >istBestandteilVon> Grundbuch
-     --ON s.istbestandteilvon = substring(g.gml_id,1,16)
        ON s.istbestandteilvon = g.gml_id
      JOIN v_bs_buchungsart art 
        ON s.buchungsart = art.wert 
      JOIN ax_flurstueck          f  -- Flurstueck >istGebucht> Buchungs-Stelle
-     --ON f.istgebucht = substring(s.gml_id,1,16)
        ON f.istgebucht = s.gml_id
      JOIN ax_gemarkung           k    
@@ -717,23 +695,18 @@
    FROM   ax_person              p
      JOIN ax_namensnummer        n    -- Namennummer >benennt> Person
-     --ON substring(p.gml_id,1,16) = n.benennt
        ON p.gml_id = n.benennt
      JOIN ax_buchungsblatt       g    -- Namensnummer >istBestandteilVon> Grundbuch
-     --ON n.istBestandteilVon = substring(g.gml_id,1,16)
        ON n.istBestandteilVon = g.gml_id
      JOIN ax_buchungsblattbezirk b    
        ON g.land = b.land AND g.bezirk = b.bezirk 
      JOIN ax_buchungsstelle      sh  -- B-Stelle herr >istBestandteilVon> Grundbuch
-     --ON sh.istbestandteilvon = substring(g.gml_id,1,16)
        ON sh.istbestandteilvon = g.gml_id -- herrschende Buchung
      JOIN v_bs_buchungsart arth 
        ON sh.buchungsart = arth.wert 
      JOIN ax_buchungsstelle      sd   -- B-Stelle herr.  >an/zu> B-Stelle dien.
-     --ON (substring(sd.gml_id,1,16) = ANY(sh.an) OR substring(sd.gml_id,1,16) = ANY(sh.zu))
        ON (sd.gml_id = ANY(sh.an) OR sd.gml_id = ANY(sh.zu))
      JOIN v_bs_buchungsart artd 
        ON sd.buchungsart = artd.wert
      JOIN ax_flurstueck          f    -- Flurstueck  >istGebucht> B-Stelle dien     
-     --ON f.istgebucht = substring(sd.gml_id,1,16)
        ON f.istgebucht = sd.gml_id
      JOIN ax_gemarkung           k    
@@ -759,5 +732,4 @@
    FROM ax_gebaeude g
    JOIN ax_lagebezeichnungmithausnummer l  
-   --ON substring(l.gml_id,1,16) = ANY(g.zeigtauf)
      ON l.gml_id = ANY(g.zeigtauf)
   WHERE g.endet IS NULL AND l.endet IS NULL
@@ -776,5 +748,4 @@
   FROM ax_gebaeude g
   JOIN fehler_hausnummer_mehrfach_verwendet f
-  --ON substring(f.gml_id::text, 1, 16) = ANY(g.zeigtauf)
     ON f.gml_id = ANY(g.zeigtauf)
   JOIN ax_lagebezeichnungkatalogeintrag k
@@ -797,5 +768,4 @@
    (SELECT g2.gml_id 
       FROM ax_gebaeude g2
-    --JOIN ax_lagebezeichnungmithausnummer l2 ON substring(l2.gml_id,1,16) = ANY(g2.zeigtauf)
       JOIN ax_lagebezeichnungmithausnummer l2 ON l2.gml_id = ANY(g2.zeigtauf)
      WHERE g2.endet IS NULL AND l2.endet IS NULL
@@ -900,7 +870,6 @@
   JOIN ax_lagebezeichnungohnehausnummer o   -- Gewanne
     ON k.bezeichnung = o.unverschluesselt   -- Gleiche Namen 
-   JOIN ax_flurstueck fo                    --  Flurst. >zeigtAuf>  Lage
-   --ON substring(o.gml_id,1,16) = ANY(fo.zeigtauf)
-     ON o.gml_id = ANY(fo.zeigtauf)  
+  JOIN ax_flurstueck fo                    --  Flurst. >zeigtAuf>  Lage
+    ON o.gml_id = ANY(fo.zeigtauf)  
  WHERE fo.gemeinde = k.gemeinde  -- Gewanne wird fÃŒr ein Flst. in gleicher Gemeinde verwendet, wie der StraÃenschlÃŒssel
    AND k.endet IS NULL AND o.endet IS NULL AND fo.endet IS NULL 
@@ -919,7 +888,5 @@
          a1.ort_post, a1.strasse AS strasse1, a2.strasse AS strasse2, a1.hausnummer
     FROM ax_person    p
-  --JOIN ax_anschrift a1 ON substring(a1.gml_id,1,16) = ANY(p.hat)
     JOIN ax_anschrift a1 ON a1.gml_id = ANY(p.hat)
-  --JOIN ax_anschrift a2 ON substring(a2.gml_id,1,16) = ANY(p.hat)
     JOIN ax_anschrift a2 ON a2.gml_id = ANY(p.hat)
    WHERE a1.gml_id <> a2.gml_id
@@ -933,162 +900,4 @@
  IS 'Nachmigration? Zu einer Person gibt es mehrere Anschriften, die in Ort und Hausnummer identisch sind und beim StraÃennemen entweder auch identisch sind oder eine AbkÃŒrzung mit Punkt enthalten.';
 
-
--- Bevor alle inversen Relationen im Schema auskommentiert werden,
--- noch mal in die Datenbank schauen, ob nicht doch eine davon gefÃŒllt ist.
--- Nach dem Entfernen dieser Spalten wird der View nicht mehr funktionieren 
--- und wird darum ebenfalls auskommentiert.
-
-/*
-CREATE OR REPLACE VIEW nicht_gefuellte_inverse_relationen_spalten
-AS
-  SELECT 'ax_flurstueck' AS tabelle, 'beziehtsichaufflurstueck' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_flurstueck WHERE NOT beziehtsichaufflurstueck IS NULL
-UNION
-  SELECT 'ax_flurstueck' AS tabelle, 'gehoertanteiligzu' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_flurstueck WHERE NOT gehoertanteiligzu IS NULL
-UNION
-  SELECT 'ax_lagebezeichnungohnehausnummer' AS tabelle, 'beschreibt' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_lagebezeichnungohnehausnummer WHERE NOT beschreibt IS NULL
-UNION
-  SELECT 'ax_lagebezeichnungohnehausnummer' AS tabelle, 'gehoertzu' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_lagebezeichnungohnehausnummer WHERE NOT gehoertzu IS NULL
-UNION
-  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'hat' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_lagebezeichnungmithausnummer WHERE NOT hat IS NULL
-UNION
-  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'beziehtsichauf' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_lagebezeichnungmithausnummer WHERE NOT beziehtsichauf IS NULL
-UNION
-  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'beziehtsichauchauf' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_lagebezeichnungmithausnummer WHERE NOT beziehtsichauchauf IS NULL
-UNION
-  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'gehoertzu' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_lagebezeichnungmithausnummer WHERE NOT gehoertzu IS NULL
-UNION
-  SELECT 'ax_lagebezeichnungmithausnummer' AS tabelle, 'weistzum' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_lagebezeichnungmithausnummer WHERE NOT weistzum IS NULL
-UNION
-  SELECT 'ax_lagebezeichnungmitpseudonummer' AS tabelle, 'gehoertzu' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_lagebezeichnungmitpseudonummer WHERE NOT gehoertzu IS NULL
---UNION
---  -- ist gefÃŒllt!
---  SELECT 'ax_georeferenziertegebaeudeadresse' AS tabelle, 'hatauch' AS spalte, 
---     count(gml_id) AS anzahl_eintraege
---  FROM ax_georeferenziertegebaeudeadresse WHERE NOT hatauch IS NULL
-UNION
-  SELECT 'ax_sicherungspunkt' AS tabelle, 'beziehtsichauf' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_sicherungspunkt WHERE NOT beziehtsichauf IS NULL
-UNION
-  SELECT 'ax_sicherungspunkt' AS tabelle, 'gehoertzu' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_sicherungspunkt WHERE NOT gehoertzu IS NULL
--- Punktort: ist gefÃŒllt (nicht invers)
---UNION
---  SELECT 'ax_punktortag' AS tabelle, 'istteilvon' AS spalte, 
---     count(gml_id) AS anzahl_eintraege
---  FROM ax_punktortag WHERE NOT istteilvon IS NULL
---UNION
---  SELECT 'ax_punktortau' AS tabelle, 'istteilvon' AS spalte, 
---     count(gml_id) AS anzahl_eintraege
---  FROM ax_punktortau WHERE NOT istteilvon IS NULL
---UNION
---  SELECT 'ax_punktortta' AS tabelle, 'istteilvon' AS spalte, 
---     count(gml_id) AS anzahl_eintraege
---  FROM ax_punktortta WHERE NOT istteilvon IS NULL
-UNION
-  SELECT 'ax_person' AS tabelle, 'weistauf' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_person WHERE NOT weistauf IS NULL
-UNION
-  SELECT 'ax_person' AS tabelle, 'uebtaus' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_person WHERE NOT uebtaus IS NULL
-UNION
-  SELECT 'ax_person' AS tabelle, 'besitzt' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_person WHERE NOT besitzt IS NULL
-UNION
-  SELECT 'ax_person' AS tabelle, 'zeigtauf' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_person WHERE NOT zeigtauf IS NULL
-UNION
-  SELECT 'ax_person' AS tabelle, 'benennt' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_person WHERE NOT benennt IS NULL
-UNION
-  SELECT 'ax_anschrift' AS tabelle, 'beziehtsichauf' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_anschrift WHERE NOT beziehtsichauf IS NULL
-UNION
-  SELECT 'ax_anschrift' AS tabelle, 'gehoertzu' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_anschrift WHERE NOT gehoertzu IS NULL
-UNION
-  SELECT 'ax_verwaltung' AS tabelle, 'beziehtsichauf' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_verwaltung WHERE NOT beziehtsichauf IS NULL
-UNION
-  SELECT 'ax_vertretung' AS tabelle, 'vertritt' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_vertretung WHERE NOT vertritt IS NULL
-UNION
-  SELECT 'ax_buchungsblatt' AS tabelle, 'bestehtaus' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_buchungsblatt WHERE NOT bestehtaus IS NULL
-UNION
-  SELECT 'ax_buchungsstelle' AS tabelle, 'grundstueckbestehtaus' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_buchungsstelle WHERE NOT grundstueckbestehtaus IS NULL
-UNION
-  SELECT 'ax_gebaeude' AS tabelle, 'haengtzusammenmit' AS spalte, 
-     count(gml_id) AS anzahl_eintraege
-  FROM ax_gebaeude WHERE NOT haengtzusammenmit IS NULL
-;
-
-COMMENT ON VIEW nicht_gefuellte_relationen_spalten
- IS 'ÃberprÃŒfung auf nicht gefÃŒllte Inverse Relationen. 
-Funktioniert nur, solange diese nicht entfernt wurden.';
-
-*/
-
--- Daraus resultiert der folgende Patch fÃŒr bereits angelegte Datenbanken:
-/*
-	ALTER TABLE ax_flurstueck                    DROP COLUMN beziehtsichaufflurstueck;
-	ALTER TABLE ax_flurstueck                    DROP COLUMN gehoertanteiligzu;
-	ALTER TABLE ax_lagebezeichnungohnehausnummer DROP COLUMN beschreibt;
-	ALTER TABLE ax_lagebezeichnungohnehausnummer DROP COLUMN gehoertzu;
-	ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN hat;
-	ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN beziehtsichauf;
-	ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN beziehtsichauchauf;
-	ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN gehoertzu;
-	ALTER TABLE ax_lagebezeichnungmithausnummer  DROP COLUMN weistzum;
-	ALTER TABLE ax_lagebezeichnungmitpseudonummer DROP COLUMN gehoertzu;
-	ALTER TABLE ax_sicherungspunkt               DROP COLUMN beziehtsichauf;
-	ALTER TABLE ax_sicherungspunkt               DROP COLUMN gehoertzu;
-	ALTER TABLE ax_person                        DROP COLUMN weistauf;
-	ALTER TABLE ax_person                        DROP COLUMN uebtaus;
-	ALTER TABLE ax_person                        DROP COLUMN besitzt;
-	ALTER TABLE ax_person                        DROP COLUMN zeigtauf;
-	ALTER TABLE ax_person                        DROP COLUMN benennt;
-	ALTER TABLE ax_anschrift                     DROP COLUMN beziehtsichauf;
-	ALTER TABLE ax_anschrift                     DROP COLUMN gehoertzu;
-	ALTER TABLE ax_verwaltung                    DROP COLUMN beziehtsichauf;
-	ALTER TABLE ax_vertretung                    DROP COLUMN vertritt;
-	ALTER TABLE ax_buchungsblatt                 DROP COLUMN bestehtaus;
-	ALTER TABLE ax_buchungsstelle                DROP COLUMN grundstueckbestehtaus;
-	ALTER TABLE ax_gebaeude                      DROP COLUMN haengtzusammenmit;
-*/
-
 -- Anteile der Namensnummern am Blatt aufsummieren.
 -- BlÃ€tter mit RechtsverhÃ€ltnis (Beschrieb) nicht beachten.
@@ -1107,5 +916,4 @@
   FROM ax_buchungsblatt g
   JOIN ax_namensnummer n 
-  --ON substring(g.gml_id,1,16) = n.istbestandteilvon
     ON g.gml_id = n.istbestandteilvon
   WHERE g.endet IS NULL AND n.endet IS NULL
@@ -1115,5 +923,4 @@
         SELECT gml_id 
         FROM ax_namensnummer nr 
-        --ERE substring(g.gml_id,1,16) = nr.istbestandteilvon
         WHERE g.gml_id = nr.istbestandteilvon
           AND NOT nr.artderrechtsgemeinschaft IS NULL
@@ -1212,3 +1019,103 @@
  IS 'Suche nach GB-Blatt mit vielen FlurstÃŒcken.';
 
+
+-- Ein typischer Fehler im NBA-Verfahren erzeugt SekundÃ€rbestÃ€nde, bei denen EigentÃŒmer fehlen.
+-- Dies kommt so zustande:
+--  - FlurstÃŒck und Person sind zum Zeitpunkt der Erstabgabe im Katasterbezirk bereits vorhanden.
+--  - Die FlurstÃŒcke werden auf Stadtgebiet gefiltert.
+--  - Die Person hat keine Verbindung zu einem FlurstÃŒck im Ausschnitt und wird nicht mit ausgeliefert. 
+--  - SpÃ€ter wird eine neue Relation zwischen FS--Buchung--GBBlatt--Namensnummer--Person  gebildet.
+--  - Die Relation wird abgegeben (gml_id der ax_person) in "ax_namensnummer.benennt"
+--  - Aber die Person fehlt im SekundÃ€rbestand, sie wurde nicht nachgeliefert.
+-- Solche FÃ€lle sollen hier gezielt gefunden werden:
+
+--           DROP VIEW fehlersuche_nba_person_mit_fs;
+CREATE OR REPLACE VIEW fehlersuche_nba_person_mit_fs
+AS
+ SELECT
+  -- FlurstÃŒck
+    f.gml_id                             AS fsgml,
+  --f.flurstueckskennzeichen,
+    f.gemarkungsnummer || '-' ||  f.flurnummer || '-' || f.zaehler ||
+      coalesce('/' || f.nenner, '') AS fs_kennz,
+  -- Grundbuch
+    gb.gml_id                            AS gbgml,
+    gb.bezirk || '-' || gb.buchungsblattnummermitbuchstabenerweiterung AS gb_kennz,
+  -- Buchungsstelle (GrundstÃŒck)
+    s.laufendenummer                     AS bu_lfd,      -- BVNR
+  -- NamensNummer (Normalfall mit Person)
+    nn.laufendenummernachdin1421         AS nam_lfd,
+  -- Person
+    nn.benennt                           AS fehlende_person_gmlid
+  --p.gml_id                             AS psgml,
+  --p.vorname, p.nachnameoderfirma,
+  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_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_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
+    ON  gb.gml_id = nn.istbestandteilvon
+  LEFT 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)
+  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 nn.artderrechtsgemeinschaft IS NULL  -- Sonderzeilen ausblenden
+    AND p.gml_id IS NULL                     -- Hier sollte eine Person vorhanden sein!!
+  ORDER BY f.flurstueckskennzeichen, 
+           gb.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, s.laufendenummer,
+           nn.laufendenummernachdin1421;
+
+COMMENT ON VIEW fehlersuche_nba_person_mit_fs 
+ IS 'Suche nach typischem Fehler "Person fehlt" nach einer NBA-Aktualisierung mit geometrischen Filter. Mit FlurstÃŒcken.';
+
+-- Durch den JOIN auf FlurstÃŒcke werden Personen-FÃ€lle ggf. mehrfach aufgefÃŒhrt.
+-- Um schneller die Ãbersicht ÃŒber die *Anzahl* zu bekommen, lÃ€sst man die FS besser weg.
+
+--           DROP VIEW fehlersuche_nba_person;
+CREATE OR REPLACE VIEW fehlersuche_nba_person
+AS
+ SELECT
+    gb.gml_id                            AS gbgml,
+    gb.bezirk || '-' || gb.buchungsblattnummermitbuchstabenerweiterung AS gb_kennz,
+    nn.laufendenummernachdin1421         AS nam_lfd,
+    nn.benennt                           AS fehlende_person_gmlid
+  FROM ax_buchungsblatt  gb
+  JOIN ax_namensnummer nn               -- Blatt <istBestandteilVon< NamNum
+    ON  gb.gml_id = nn.istbestandteilvon
+  LEFT JOIN ax_person p                 -- NamNum >benennt> Person 
+    ON p.gml_id = nn.benennt
+  WHERE gb.endet IS NULL AND nn.endet IS NULL AND p.endet IS NULL
+    AND nn.artderrechtsgemeinschaft IS NULL  -- Sonderzeilen ausblenden
+    AND p.gml_id IS NULL                     -- Hier sollte eine Person vorhanden sein!!
+  ORDER BY gb.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, nn.laufendenummernachdin1421;
+
+COMMENT ON VIEW fehlersuche_nba_person 
+ IS 'Suche nach typischem Fehler "Person fehlt" nach einer NBA-Aktualisierung mit geometrischen Filter. OHNE FlurstÃŒcke.';
+
+
+-- In der SQLite-Version der Datenbank sind die Relationen "hat" und "benennt" nicht gefÃŒllt.
+-- Darum ÃŒber die zentrale Beziehungen-Tabelle gehen!
+CREATE OR REPLACE VIEW fehlersuche_nba_person_old_Style
+AS
+ SELECT
+    gb.gml_id AS gbgml,
+    gb.bezirk || '-' || gb.buchungsblattnummermitbuchstabenerweiterung AS gb_kennz,
+    nn.laufendenummernachdin1421  AS nam_lfd,
+    a2.beziehung_zu               AS fehlende_person_gmlid
+  FROM ax_buchungsblatt  gb  
+  JOIN alkis_beziehungen a1 ON a1.beziehung_zu=gb.gml_id  AND a1.beziehungsart='istBestandteilVon'
+  JOIN ax_namensnummer   nn ON a1.beziehung_von=nn.gml_id
+  JOIN alkis_beziehungen a2 ON a2.beziehung_von=nn.gml_id AND a2.beziehungsart='benennt' 
+  LEFT JOIN ax_person p     ON a2.beziehung_zu=p.gml_id 
+  WHERE gb.endet IS NULL AND nn.endet IS NULL AND p.endet IS NULL
+    AND nn.artderrechtsgemeinschaft IS NULL  AND p.gml_id IS NULL
+  ORDER BY gb.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, nn.laufendenummernachdin1421;
+
+COMMENT ON VIEW fehlersuche_nba_person_old_Style 
+ IS 'Suche nach typischem Fehler "Person fehlt" nach einer NBA-Aktualisierung mit geometrischen Filter. Relation ÃŒber alkis_beziehungen, dann klappt das auch in SQLite.';
+
 -- END --
