Ignore:
Timestamp:
02/21/13 13:56:16 (11 years ago)
Author:
frank.jaeger
Message:

View zum Suchen und SQL-Befehl zum Löschen alter Versionen der ALKIS-Beziehungen zw. Flurstück und Buchungsstelle. Diese werden bei Replace nicht korrekt entfernt, wenn gleichzeitig Flurstück und Buchung geändert werden.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/import/pp_laden.sql

    r257 r265  
    1111--  2012-04-24 Generell Filter 'endet IS NULL' um historische Objekte auszublenden 
    1212--  2012-04-25 Abstürze und Fehler (durch kaputte Geometrie?) beim Zusammenfassen der Flächen 
    13 --             Mehr buffer, mehr st_simplify? 
    14 --  2012-10-29 Redundanzen aus alkis_beziehungen beseitigen, die nach NAS replace auftreten 
     13--  2012-10-29 F.J. Redundanzen aus alkis_beziehungen beseitigen, die nach NAS replace auftreten 
     14--  2013-02-06 A.E. Function-Name an PostGIS 2 angepasst: multi() -> st_multi(), simplify() -> st_simplify() 
     15--  2013-02-21 F.J. doppelte Buchungen zum Flurstück aus alkis_beziehungen beseitigen, die nach NAS replace auftreten 
    1516 
    1617-- ============================ 
     
    5253-- auf eine bestimmte gml_id filtert. 
    5354-- Damit wäre die DB schon während der Konvertierung konsistenter. 
     55-- Nachtrag 2013-02-20: 
     56-- Diese provisorische Lösung korrigiert nur die Fälle, wo ein Replace eine redundante Beziehung 
     57-- einträgt. Wenn ein Objekt und seine Beziehung gleichzeitig geändert wird, wird der alte 
     58-- Eintrag nicht gefunden und verbleibt in den Beziehungen. 
     59-- Siehe z.B. in Datei "sichten.sql" die Abfrage "mehrfache_buchung_zu_fs"  
     60 
     61 
     62-- Mehrfache Buchungen zu einem Flurstück korrigieren. 
     63-- Neu 2013-02-21 
     64-- Dieser Fehler enststeht, wenn ein Replace zu "ax_flurstueck" gleichzeitig die 
     65-- Beziehung 'istGebucht' zu "ax_buchungsStelle" ändert. 
     66-- Kann entfallen, sobald PostNAS bei Replace die "alkis_beziehungen" richtig fortführt. 
     67 
     68-- Version Marvin Brandt, Unna 
     69--      DELETE 
     70--      --  SELECT * 
     71--      FROM alkis_beziehungen a1 
     72--      WHERE a1.beziehung_von = ANY(SELECT gml_id FROM ( 
     73--                              SELECT f.*, 
     74--                                              (SELECT count(f2.gml_id) as anzahl 
     75--                                              FROM ax_flurstueck f2 
     76--                                              JOIN alkis_beziehungen a1 ON f2.gml_id = a1.beziehung_von AND a1.beziehungsart = 'istGebucht' 
     77--                                              WHERE f2.gml_id = f.gml_id 
     78--                                              ) as anzahl 
     79--                                      FROM ax_flurstueck f 
     80--                                      ) as sub 
     81--                              WHERE sub.anzahl > 1 ) 
     82--      AND a1.beziehungsart = 'istGebucht' 
     83--      AND a1.ogc_fid = (SELECT min(sub.ogc_fid) as ogc_fid FROM ( 
     84--              SELECT a1.*, 
     85--                      (SELECT count(f2.gml_id) as anzahl 
     86--                              FROM ax_flurstueck f2 
     87--                              JOIN alkis_beziehungen a1 ON f2.gml_id = a1.beziehung_von AND a1.beziehungsart = 'istGebucht' 
     88--                              WHERE f2.gml_id = f.gml_id 
     89--                      ) as anzahl 
     90--              FROM ax_flurstueck f 
     91--              JOIN alkis_beziehungen a1  
     92--              ON f.gml_id = a1.beziehung_von AND a1.beziehungsart = 'istGebucht' 
     93--              ) as sub 
     94--      WHERE sub.beziehung_von = a1.beziehung_von); 
     95 
     96 
     97-- Version Frank Jäger, Lemgo  
     98DELETE 
     99-- SELECT *   -- TEST: erst mal schauen, was gelöscht würde, wenn ... 
     100FROM alkis_beziehungen b 
     101WHERE b.beziehungsart = 'istGebucht' 
     102  -- Die erste subquery zählt die Buchungen zu einer (Flurstücks-) gml_id. 
     103  -- Es wird nur dort gelöscht, wo mehrerer Buchungen existieren. 
     104  AND 1 <  
     105     ( SELECT count(f1.ogc_fid) AS anzfs 
     106        FROM ax_flurstueck f1 
     107        JOIN alkis_beziehungen z 
     108          ON f1.gml_id = z.beziehung_von 
     109       WHERE f1.gml_id = b.beziehung_von 
     110         AND z.beziehungsart = 'istGebucht' 
     111       GROUP BY f1.gml_id ) 
     112  -- Die zweite Subquery liefert die letzte (= aktuelle) Beziehung. 
     113  -- Diese aktuelle Buchung wird vom Löschen ausgeschlossen. 
     114  AND b.ogc_fid < 
     115     ( SELECT max(a.ogc_fid) AS maxi 
     116        FROM ax_flurstueck f2 
     117        JOIN alkis_beziehungen a 
     118          ON f2.gml_id = a.beziehung_von 
     119       WHERE f2.gml_id = b.beziehung_von 
     120         AND a.beziehungsart = 'istGebucht' 
     121       GROUP BY a.beziehung_von ) 
     122-- bei Test mit SELECT darf man sortieren: 
     123--  ORDER BY b.beziehung_von, b.ogc_fid 
     124; 
     125 
    54126 
    55127 
Note: See TracChangeset for help on using the changeset viewer.