sync_attach_ext: "
ATTACH DATABASE ? AS ext"

sync_collect_teilgebiete: "
WITH tgb AS (
    SELECT teilgebiet FROM flaechen
    WHERE teilgebiet IS NOT NULL
    UNION
    SELECT teilgebiet FROM tezg
    WHERE teilgebiet IS NOT NULL
    UNION
    SELECT teilgebiet FROM haltungen
    WHERE teilgebiet IS NOT NULL
    UNION
    SELECT teilgebiet FROM schaechte
    WHERE teilgebiet IS NOT NULL
)
INSERT INTO teilgebiete (tgnam)
SELECT teilgebiet FROM tgb
WHERE teilgebiet NOT IN (SELECT tgnam FROM teilgebiete)
GROUP BY teilgebiet"

sync_list_teilgebiete: "
SELECT tgnam FROM teilgebiete GROUP BY tgnam"


# SQL name pattern for all tables:
#   sync_create_{table},
#   sync_create_{table}_geom,
#   sync_reset_{table},
#   sync_{table}_ext,
#   sync_{table}_local,
#   sync_{table}_dif,
#
#   sync_{table}_add,
#   sync_{table}_del,
#   sync_{table}_mod

sync_create_haltungen: "
CREATE TABLE IF NOT EXISTS sync_haltungen (
    pk INTEGER PRIMARY KEY,
    pk_best INT,
    pk_ext INT,
    aktion TEXT,
    status INT,
    objekt TEXT,
    haltnam TEXT,
    schoben TEXT,
    schunten TEXT,
    hoehe REAL,
    breite REAL,
    laenge REAL,
    aussendurchmesser REAL,
    sohleoben REAL,
    sohleunten REAL,
    baujahr INT,
    eigentum TEXT,
    teilgebiet TEXT,
    strasse TEXT,
    profilnam TEXT,
    entwart TEXT,
    material TEXT,
    profilauskleidung TEXT,
    innenmaterial TEXT,
    ks REAL,
    haltungstyp TEXT,
    simstatus TEXT,
    rwanschluss INTEGER,
    druckdicht INTEGER,
    kommentar TEXT,
    createdat TEXT DEFAULT CURRENT_TIMESTAMP);"

sync_create_haltungen_geom: "
SELECT AddGeometryColumn('sync_haltungen', 'geom', :epsg, 'LINESTRING', 2);"

sync_reset_haltungen: "
DELETE FROM sync_haltungen;"

# Haltungen, die nur in der externen Datenbank vorkommen, Vergleich anhand Haltungsname
sync_haltungen_ext: "
INSERT INTO sync_haltungen (
    pk_best, pk_ext, haltnam, objekt, aktion, status,
    schoben, schunten, hoehe, breite, laenge, aussendurchmesser, sohleoben, sohleunten, 
    baujahr, eigentum, teilgebiet, strasse, profilnam, entwart, material, profilauskleidung, innenmaterial, ks, haltungstyp, 
    simstatus, rwanschluss, druckdicht, kommentar, createdat, geom)
SELECT 
    NULL AS pk_best, ex.pk AS pk_ext, ex.haltnam,
    'Datensatz nicht im Bestand' AS objekt, 'hinzufügen' AS aktion, 1 AS status,      /* hinzufügen */
    ex.schoben, ex.schunten, ex.hoehe, ex.breite, ex.laenge, ex.aussendurchmesser, ex.sohleoben, ex.sohleunten,
    ex.baujahr, ex.eigentum, ex.teilgebiet, ex.strasse, ex.profilnam, ex.entwart, ex.material, ex.profilauskleidung,
    ex.innenmaterial, ex.ks, ex.haltungstyp, ex.simstatus, ex.rwanschluss, ex.druckdicht, ex.kommentar, ex.createdat, ex.geom
FROM (
    SELECT * 
    FROM ext.haltungen AS h
    WHERE NOT :seltgb
       OR h.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY h.haltnam
   HAVING count() = 1
) AS ex
LEFT JOIN (
    SELECT *
    FROM main.haltungen AS h
    WHERE NOT :seltgb
       OR h.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
    GROUP BY h.haltnam
    HAVING count() = 1
) AS be
ON be.haltnam = ex.haltnam
WHERE be.pk IS NULL;"

# Haltungen, die nur in der bestehenden Datenbank vorkommen, Vergleich anhand Haltungsname
sync_haltungen_local: "
INSERT INTO sync_haltungen (
    pk_best, pk_ext, haltnam, objekt, aktion, status,
    schoben, schunten, hoehe, breite, laenge, aussendurchmesser, sohleoben, sohleunten, 
    baujahr, eigentum, teilgebiet, strasse, profilnam, entwart, material, profilauskleidung, innenmaterial, ks, haltungstyp, 
    simstatus, rwanschluss, druckdicht, kommentar, createdat, geom)
SELECT
    be.pk AS pk_best, NULL AS pk_ext, be.haltnam,
    'Datensatz extern nicht vorhanden' AS objekt, 'löschen' AS aktion, 0 AS status,      /* löschen */
    be.schoben, be.schunten, be.hoehe, be.breite, be.laenge, be.aussendurchmesser, be.sohleoben, be.sohleunten,
    be.baujahr, be.eigentum, be.teilgebiet, be.strasse, be.profilnam, be.entwart, be.material, be.profilauskleidung,
    be.innenmaterial, be.ks, be.haltungstyp, be.simstatus, be.rwanschluss, be.druckdicht, be.kommentar, be.createdat, be.geom
FROM (
    SELECT *
    FROM main.haltungen AS h
    WHERE NOT :seltgb
       OR h.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
    GROUP BY h.haltnam
    HAVING count() = 1
) AS be
LEFT JOIN (
    SELECT * 
    FROM ext.haltungen AS h
    WHERE NOT :seltgb
       OR h.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY h.haltnam
   HAVING count() = 1
) AS ex
ON be.haltnam = ex.haltnam
WHERE ex.pk IS NULL;"


# Haltungen mit gleichem Namen, die sich in mindestens einem Attribut unterscheiden
sync_haltungen_dif: "
INSERT INTO sync_haltungen (
    pk_best, pk_ext, haltnam, objekt, aktion, status,
    schoben, schunten, hoehe, breite, laenge, aussendurchmesser, sohleoben, sohleunten, 
    baujahr, eigentum, teilgebiet, strasse, profilnam, entwart, material, profilauskleidung, innenmaterial, ks, haltungstyp, 
    simstatus, rwanschluss, druckdicht, kommentar, createdat, geom)
SELECT
    be.pk AS pk_best,
    ex.pk AS pk_ext,
    ex.haltnam,
    iif(ex.geom <> be.geom, printf('Geometrie geändert. Änderungen übernehmen?'), NULL) AS objekt,
    'ändern' AS aktion,
    1 AS status,
    iif(coalesce(abs(be.schoben - ex.schoben), 0) > 0.001, printf('%s -> %s', be.schoben, ex.schoben), NULL) AS schoben,
    iif(coalesce(abs(be.schunten - ex.schunten), 0) > 0.001, printf('%s -> %s', be.schunten, ex.schunten), NULL) AS schunten,
    iif(coalesce(abs(be.hoehe - ex.hoehe), 0) > 0.001, printf('%.2f -> %.2f', ex.hoehe, be.hoehe), NULL) AS hoehe,
    iif(coalesce(abs(be.breite - ex.breite), 0) > 0.001, printf('%.0f -> %.0f', ex.breite, be.breite), NULL) AS breite,
    iif(coalesce(abs(be.laenge - ex.laenge), 0) > 0.001, printf('%.2f -> %.2f', ex.laenge, be.laenge), NULL) AS laenge,
    iif(coalesce(abs(be.aussendurchmesser - ex.aussendurchmesser), 0) > 0.001, printf('%.0f -> %.0f', ex.aussendurchmesser, be.aussendurchmesser), NULL) AS aussendurchmesser,
    iif(coalesce(abs(be.sohleoben - ex.sohleoben), 0) > 0.001, printf('%.2f -> %.2f', ex.sohleoben, be.sohleoben), NULL) AS sohleoben,
    iif(coalesce(abs(be.sohleunten - ex.sohleunten), 0) > 0.001, printf('%.2f -> %.2f', ex.sohleunten, be.sohleunten), NULL) AS sohleunten,
    iif(coalesce(abs(be.baujahr - ex.baujahr), 0) > 0.001, printf('%.d -> %.d', ex.baujahr, be.baujahr), NULL) AS baujahr,
    iif(be.eigentum <> ex.eigentum, printf('%s -> %s', be.eigentum, ex.eigentum), NULL) AS eigentum,
    iif(be.teilgebiet <> ex.teilgebiet, printf('%s -> %s', be.teilgebiet, ex.teilgebiet), NULL) AS teilgebiet,
    iif(be.strasse <> ex.strasse, printf('%s -> %s', be.strasse, ex.strasse), NULL) AS strasse,
    iif(be.profilnam <> ex.profilnam, printf('%s -> %s', be.profilnam, ex.profilnam), NULL) AS profilnam,
    iif(be.entwart <> ex.entwart, printf('%s -> %s', be.entwart, ex.entwart), NULL) AS entwart,
    iif(be.material <> ex.material, printf('%s -> %s', be.material, ex.material), NULL) AS material,
    iif(be.profilauskleidung <> ex.profilauskleidung, printf('%s -> %s', be.profilauskleidung, ex.profilauskleidung), NULL) AS profilauskleidung,
    iif(be.innenmaterial <> ex.innenmaterial, printf('%s -> %s', be.innenmaterial, ex.innenmaterial), NULL) AS innenmaterial,
    iif(be.ks <> ex.ks, printf('%.4f -> %.4f', ex.ks, be.ks), NULL) AS ks,
    iif(be.haltungstyp <> ex.haltungstyp, printf('%s -> %s', be.haltungstyp, ex.haltungstyp), NULL) AS haltungstyp,
    iif(be.simstatus <> ex.simstatus, printf('%s -> %s', be.simstatus, ex.simstatus), NULL) AS simstatus,
    iif(be.rwanschluss <> ex.rwanschluss, printf('%s -> %s', be.rwanschluss, ex.rwanschluss), NULL) AS rwanschluss,
    iif(be.druckdicht <> ex.druckdicht, printf('%s -> %s', be.druckdicht, ex.druckdicht), NULL) AS druckdicht,
    iif(be.kommentar <> ex.kommentar, printf('%s -> %s', be.kommentar, ex.kommentar), NULL) AS kommentar,
    iif(abs(Julianday(be.createdat) - Julianday(ex.createdat)) > 0.5, printf('%s -> %s', ex.createdat, be.createdat), NULL) AS createdat,
    be.geom AS geom
FROM (
    SELECT *
    FROM main.haltungen AS h
    WHERE NOT :seltgb
       OR h.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
    GROUP BY h.haltnam
    HAVING count() = 1
) AS be
JOIN (
    SELECT * 
    FROM ext.haltungen AS h
    WHERE NOT :seltgb
       OR h.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY h.haltnam
   HAVING count() = 1
) AS ex
ON ex.haltnam = be.haltnam
WHERE
    coalesce(abs(be.schoben - ex.schoben), 0) > 0.001 OR
    coalesce(abs(be.schunten - ex.schunten), 0) > 0.001 OR
    coalesce(abs(be.hoehe - ex.hoehe), 0) > 0.001 OR
    coalesce(abs(be.breite - ex.breite), 0) > 0.001 OR
    coalesce(abs(be.laenge - ex.laenge), 0) > 0.001 OR
    coalesce(abs(be.aussendurchmesser - ex.aussendurchmesser), 0) > 0.001 OR
    coalesce(abs(be.sohleoben - ex.sohleoben), 0) > 0.001 OR
    coalesce(abs(be.sohleunten - ex.sohleunten), 0) > 0.001 OR
    coalesce(abs(be.baujahr - ex.baujahr), 0) > 0.001 OR
    be.eigentum <> ex.eigentum OR
    be.teilgebiet <> ex.teilgebiet OR
    be.strasse <> ex.strasse OR
    be.profilnam <> ex.profilnam OR
    be.entwart <> ex.entwart OR
    be.material <> ex.material OR
    be.profilauskleidung <> ex.profilauskleidung OR
    be.innenmaterial <> ex.innenmaterial OR
    be.ks <> ex.ks OR
    be.haltungstyp <> ex.haltungstyp OR
    be.simstatus <> ex.simstatus OR
    be.rwanschluss <> ex.rwanschluss OR
    be.druckdicht <> ex.druckdicht OR
    be.kommentar <> ex.kommentar OR
    abs(Julianday(be.createdat) - Julianday(ex.createdat)) > 0.5 OR
    be.geom <> ex.geom;"


# Synchronisationstabelle Schächte erstellen
sync_create_schaechte: "
CREATE TABLE IF NOT EXISTS sync_schaechte (
    pk INTEGER PRIMARY KEY,
    pk_best INT,
    pk_ext INT,
    aktion TEXT,
    status INT,
    punktobjekt TEXT, 
    grafikobjekt TEXT,
    schnam TEXT,
    sohlhoehe REAL,
    deckelhoehe REAL,
    durchm REAL,
    druckdicht INTEGER,
    ueberstauflaeche REAL,
    entwart TEXT,
    strasse TEXT,
    baujahr INTEGER,
    eigentum TEXT,
    teilgebiet TEXT,
    knotentyp TEXT,
    auslasstyp TEXT,
    schachttyp TEXT,
    simstatus TEXT,
    material TEXT,
    xsch REAL,
    ysch REAL,
    kommentar TEXT,
    createdat TEXT DEFAULT CURRENT_TIMESTAMP);"

sync_create_schaechte_geom: "
SELECT AddGeometryColumn('sync_schaechte', 'geom', :epsg, 'POINT', 2);"

sync_reset_schaechte: "
DELETE FROM sync_schaechte;"

# Schächte, die nur in der externen Datenbank vorkommen, Vergleich anhand Schachtname
sync_schaechte_ext: "
INSERT INTO sync_schaechte (
    pk_best, pk_ext, schnam, punktobjekt, grafikobjekt, aktion, status, 
    sohlhoehe, deckelhoehe, durchm, druckdicht, ueberstauflaeche, entwart, 
    strasse, baujahr, eigentum, teilgebiet, knotentyp, auslasstyp, schachttyp, 
    simstatus, material, xsch, ysch, kommentar, createdat, geom)
SELECT 
    NULL AS pk_best, ex.pk AS pk_ext, ex.schnam,
    'Datensatz nicht im Bestand' AS punktobjekt, NULL AS grafikobjekt, 'hinzufügen' AS aktion, 1 AS status,      /* hinzufügen */
    ex.sohlhoehe, ex.deckelhoehe, ex.durchm, ex.druckdicht, ex.ueberstauflaeche, ex.entwart, 
    ex.strasse, ex.baujahr, ex.eigentum, ex.teilgebiet, ex.knotentyp, ex.auslasstyp, ex.schachttyp, 
    ex.simstatus, ex.material, ex.xsch, ex.ysch, ex.kommentar, ex.createdat, ex.geop AS geom
FROM (
    SELECT * 
    FROM ext.schaechte AS s
    WHERE NOT :seltgb
       OR s.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY s.schnam
   HAVING count() = 1
) AS ex
LEFT JOIN (
    SELECT * 
    FROM main.schaechte AS s
    WHERE NOT :seltgb
       OR s.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY s.schnam
   HAVING count() = 1
) AS be
ON be.schnam = ex.schnam
WHERE be.pk IS NULL;"

# Schächte, die nur in der bestehenden Datenbank vorkommen, Vergleich anhand Schachtname
sync_schaechte_local: "
INSERT INTO sync_schaechte (
    pk_best, pk_ext, schnam, punktobjekt, grafikobjekt, aktion, status, 
    sohlhoehe, deckelhoehe, durchm, druckdicht, ueberstauflaeche, entwart, 
    strasse, baujahr, eigentum, teilgebiet, knotentyp, auslasstyp, schachttyp, 
    simstatus, material, xsch, ysch, kommentar, createdat, geom)
SELECT
    be.pk AS pk_best, NULL AS pk_ext, be.schnam,
    'Datensatz extern nicht vorhanden' AS punktobjekt, NULL AS grafikobjekt, 'löschen' AS aktion, 0 AS status,      /* löschen */
    be.sohlhoehe, be.deckelhoehe, be.durchm, be.druckdicht, be.ueberstauflaeche, be.entwart, 
    be.strasse, be.baujahr, be.eigentum, be.teilgebiet, be.knotentyp, be.auslasstyp, be.schachttyp, 
    be.simstatus, be.material, be.xsch, be.ysch, be.kommentar, be.createdat, be.geop AS geom
FROM (
    SELECT * 
    FROM main.schaechte AS s
    WHERE NOT :seltgb
       OR s.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY s.schnam
   HAVING count() = 1
) AS be
LEFT JOIN (
    SELECT * 
    FROM ext.schaechte AS s
    WHERE NOT :seltgb
       OR s.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY s.schnam
   HAVING count() = 1
) AS ex ON be.schnam = ex.schnam
WHERE ex.pk IS NULL;"


# Schächte mit gleichem Namen, die sich in mindestens einem Attribut unterscheiden
sync_schaechte_dif: "
INSERT INTO sync_schaechte (
    pk_best, pk_ext, schnam, punktobjekt, grafikobjekt, aktion, status, 
    sohlhoehe, deckelhoehe, durchm, druckdicht, ueberstauflaeche, entwart, 
    strasse, baujahr, eigentum, teilgebiet, knotentyp, auslasstyp, schachttyp, 
    simstatus, material, xsch, ysch, kommentar, createdat, geom)
SELECT
    be.pk AS pk_best,
    ex.pk AS pk_ext,
    ex.schnam,
    iif(ex.geop <> be.geop, printf('Geometrie geändert.'), NULL) AS punktobjekt,
    iif(ex.geom <> be.geom, printf('Geometrie geändert.'), NULL) AS grafikobjekt,
    'ändern' AS aktion,
    1 AS status,
    iif(coalesce(abs(be.sohlhoehe - ex.sohlhoehe), 0) > 0.001, printf('%s -> %s', be.sohlhoehe, ex.sohlhoehe), NULL) AS sohlhoehe,
    iif(coalesce(abs(be.deckelhoehe - ex.deckelhoehe), 0) > 0.001, printf('%s -> %s', be.deckelhoehe, ex.deckelhoehe), NULL) AS deckelhoehe,
    iif(coalesce(abs(be.durchm - ex.durchm), 0) > 0.001, printf('%s -> %s', be.durchm, ex.durchm), NULL) AS durchm,
    iif(be.druckdicht <> ex.druckdicht, printf('%s -> %s', be.druckdicht, ex.druckdicht), NULL) AS druckdicht,
    iif(coalesce(abs(be.ueberstauflaeche - ex.ueberstauflaeche), 0) > 0.1, printf('%s -> %s', be.ueberstauflaeche, ex.ueberstauflaeche), NULL) AS ueberstauflaeche,
    iif(be.entwart <> ex.entwart, printf('%s -> %s', be.entwart, ex.entwart), NULL) AS entwart,
    iif(be.strasse <> ex.strasse, printf('%s -> %s', be.strasse, ex.strasse), NULL) AS strasse,
    iif(be.baujahr <> ex.baujahr, printf('%s -> %s', be.baujahr, ex.baujahr), NULL) AS baujahr,
    iif(be.eigentum <> ex.eigentum, printf('%s -> %s', be.eigentum, ex.eigentum), NULL) AS eigentum,
    iif(be.teilgebiet <> ex.teilgebiet, printf('%s -> %s', be.teilgebiet, ex.teilgebiet), NULL) AS teilgebiet,
    iif(be.knotentyp <> ex.knotentyp, printf('%s -> %s', be.knotentyp, ex.knotentyp), NULL) AS knotentyp,
    iif(be.auslasstyp <> ex.auslasstyp, printf('%s -> %s', be.auslasstyp, ex.auslasstyp), NULL) AS auslasstyp,
    iif(be.schachttyp <> ex.schachttyp, printf('%s -> %s', be.schachttyp, ex.schachttyp), NULL) AS schachttyp,
    iif(be.simstatus <> ex.simstatus, printf('%s -> %s', be.simstatus, ex.simstatus), NULL) AS simstatus,
    iif(be.material <> ex.material, printf('%s -> %s', be.material, ex.material), NULL) AS material,
    iif(coalesce(abs(be.xsch - ex.xsch), 0) > 0.001, printf('%s -> %s', be.xsch, ex.xsch), NULL) AS xsch,
    iif(coalesce(abs(be.ysch - ex.ysch), 0) > 0.001, printf('%s -> %s', be.ysch, ex.ysch), NULL) AS ysch,
    iif(be.kommentar <> ex.kommentar, printf('%s -> %s', be.kommentar, ex.kommentar), NULL) AS kommentar,
    iif(abs(Julianday(be.createdat) - Julianday(ex.createdat)) > 0.5, printf('%s -> %s', ex.createdat, be.createdat), NULL) AS createdat,
    be.geop AS geom
FROM (
    SELECT * 
    FROM main.schaechte AS s
    WHERE NOT :seltgb
       OR s.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY s.schnam
   HAVING count() = 1
) AS be
JOIN (
    SELECT * 
    FROM ext.schaechte AS s
    WHERE NOT :seltgb
       OR s.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY s.schnam
   HAVING count() = 1
) AS ex ON ex.schnam = be.schnam
WHERE
    coalesce(abs(be.sohlhoehe - ex.sohlhoehe), 0) > 0.001 OR
    coalesce(abs(be.deckelhoehe - ex.deckelhoehe), 0) > 0.001 OR
    coalesce(abs(be.durchm - ex.durchm), 0) > 0.001 OR
    be.druckdicht <> ex.druckdicht OR
    coalesce(abs(be.ueberstauflaeche - ex.ueberstauflaeche), 0) > 0.001 OR
    be.entwart <> ex.entwart OR
    be.strasse <> ex.strasse OR
    be.baujahr <> ex.baujahr OR
    be.eigentum <> ex.eigentum OR
    be.teilgebiet <> ex.teilgebiet OR
    be.knotentyp <> ex.knotentyp OR
    be.auslasstyp <> ex.auslasstyp OR
    be.schachttyp <> ex.schachttyp OR
    be.simstatus <> ex.simstatus OR
    be.material <> ex.material OR
    coalesce(abs(be.xsch - ex.xsch), 0) > 0.001 OR
    coalesce(abs(be.ysch - ex.ysch), 0) > 0.001 OR
    be.kommentar <> ex.kommentar OR
    abs(Julianday(be.createdat) - Julianday(ex.createdat)) > 0.5 OR
    be.geop <> ex.geop OR
    be.geom <> ex.geom;"

# Synchronisationstabelle Anschlussleitungen erstellen

sync_create_anschlussleitungen: "
CREATE TABLE IF NOT EXISTS sync_anschlussleitungen (
    pk INTEGER PRIMARY KEY,
    pk_best INT,
    pk_ext INT,
    aktion TEXT,
    status INT,
    objekt TEXT,
    leitnam TEXT,
    schoben TEXT,
    schunten TEXT,
    hoehe REAL,
    breite REAL,
    laenge REAL,
    aussendurchmesser REAL,
    sohleoben REAL,
    sohleunten REAL,
    baujahr INT,
    haltnam TEXT,
    teilgebiet TEXT,
    strasse TEXT,
    profilnam TEXT,
    entwart TEXT,
    material TEXT,
    profilauskleidung TEXT,
    innenmaterial TEXT,
    ks REAL,
    anschlusstyp TEXT,
    simstatus TEXT,
    kommentar TEXT,
    createdat TEXT DEFAULT CURRENT_TIMESTAMP);"

sync_create_anschlussleitungen_geom: "
SELECT AddGeometryColumn('sync_anschlussleitungen', 'geom', :epsg, 'LINESTRING', 2);"

sync_reset_anschlussleitungen: "
DELETE FROM sync_anschlussleitungen;"

# Anschlussleitungen, die nur in der externen Datenbank vorkommen, Vergleich anhand Haltungsname
sync_anschlussleitungen_ext: "
INSERT INTO sync_anschlussleitungen (
    pk_best, pk_ext, leitnam, objekt, aktion, status,
    schoben, schunten, hoehe, breite, laenge, aussendurchmesser, sohleoben, sohleunten, 
    baujahr, haltnam, teilgebiet, strasse, profilnam, entwart, material, profilauskleidung, innenmaterial, ks, anschlusstyp, 
    simstatus, kommentar, createdat, geom)
SELECT 
    NULL AS pk_best, ex.pk AS pk_ext, ex.leitnam,
    'Datensatz nicht im Bestand' AS objekt, 'hinzufügen' AS aktion, 1 AS status,      /* hinzufügen */
    ex.schoben, ex.schunten, ex.hoehe, ex.breite, ex.laenge, ex.aussendurchmesser, ex.sohleoben, ex.sohleunten,
    ex.baujahr, ex.haltnam, ex.teilgebiet, ex.strasse, ex.profilnam, ex.entwart, ex.material, ex.profilauskleidung,
    ex.innenmaterial, ex.ks, ex.anschlusstyp, ex.simstatus, ex.kommentar, ex.createdat, ex.geom
FROM (
    SELECT * 
    FROM ext.anschlussleitungen AS a
    WHERE NOT :seltgb
       OR a.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY a.leitnam
   HAVING count() = 1
) AS ex
LEFT JOIN (
    SELECT * 
    FROM main.anschlussleitungen AS a
    WHERE NOT :seltgb
       OR a.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY a.leitnam
   HAVING count() = 1
) AS be ON be.leitnam = ex.leitnam
WHERE be.pk IS NULL;"

# Anschlussleitungen, die nur in der bestehenden Datenbank vorkommen, Vergleich anhand Haltungsname
sync_anschlussleitungen_local: "
INSERT INTO sync_anschlussleitungen (
    pk_best, pk_ext, leitnam, objekt, aktion, status,
    schoben, schunten, hoehe, breite, laenge, aussendurchmesser, sohleoben, sohleunten, 
    baujahr, haltnam, teilgebiet, strasse, profilnam, entwart, material, profilauskleidung, innenmaterial, ks, anschlusstyp, 
    simstatus, kommentar, createdat, geom)
SELECT
    be.pk AS pk_best, NULL AS pk_ext, be.leitnam,
    'Datensatz extern nicht vorhanden' AS objekt, 'löschen' AS aktion, 0 AS status,      /* löschen */
    be.schoben, be.schunten, be.hoehe, be.breite, be.laenge, be.aussendurchmesser, be.sohleoben, be.sohleunten,
    be.baujahr, be.haltnam, be.teilgebiet, be.strasse, be.profilnam, be.entwart, be.material, be.profilauskleidung,
    be.innenmaterial, be.ks, be.anschlusstyp, be.simstatus, be.kommentar, be.createdat, be.geom
FROM (
    SELECT * 
    FROM main.anschlussleitungen AS a
    WHERE NOT :seltgb
       OR a.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY a.leitnam
   HAVING count() = 1
) AS be
LEFT JOIN (
    SELECT * 
    FROM ext.anschlussleitungen AS a
    WHERE NOT :seltgb
       OR a.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY a.leitnam
   HAVING count() = 1
) AS ex ON be.leitnam = ex.leitnam
WHERE ex.pk IS NULL;"

# Anschlussleitungen mit gleichem Namen, die sich in mindestens einem Attribut unterscheiden
sync_anschlussleitungen_dif: "
INSERT INTO sync_anschlussleitungen (
    pk_best, pk_ext, leitnam, objekt, aktion, status,
    schoben, schunten, hoehe, breite, laenge, aussendurchmesser, sohleoben, sohleunten, 
    baujahr, haltnam, teilgebiet, strasse, profilnam, entwart, material, profilauskleidung, innenmaterial, ks, anschlusstyp, 
    simstatus, kommentar, createdat, geom)
SELECT
    be.pk AS pk_best,
    ex.pk AS pk_ext,
    ex.leitnam,
    iif(ex.geom <> be.geom, printf('Geometrie geändert'), NULL) AS objekt,
    'ändern' AS aktion,
    1 AS status,
    iif(coalesce(abs(be.schoben - ex.schoben), 0) > 0.001, printf('%s -> %s', be.schoben, ex.schoben), NULL) AS schoben,
    iif(coalesce(abs(be.schunten - ex.schunten), 0) > 0.001, printf('%s -> %s', be.schunten, ex.schunten), NULL) AS schunten,
    iif(coalesce(abs(be.hoehe - ex.hoehe), 0) > 0.001, printf('%.2f -> %.2f', ex.hoehe, be.hoehe), NULL) AS hoehe,
    iif(coalesce(abs(be.breite - ex.breite), 0) > 0.001, printf('%.0f -> %.0f', ex.breite, be.breite), NULL) AS breite,
    iif(coalesce(abs(be.laenge - ex.laenge), 0) > 0.001, printf('%.2f -> %.2f', ex.laenge, be.laenge), NULL) AS laenge,
    iif(coalesce(abs(be.aussendurchmesser - ex.aussendurchmesser), 0) > 0.001, printf('%.0f -> %.0f', ex.aussendurchmesser, be.aussendurchmesser), NULL) AS aussendurchmesser,
    iif(coalesce(abs(be.sohleoben - ex.sohleoben), 0) > 0.001, printf('%.2f -> %.2f', ex.sohleoben, be.sohleoben), NULL) AS sohleoben,
    iif(coalesce(abs(be.sohleunten - ex.sohleunten), 0) > 0.001, printf('%.2f -> %.2f', ex.sohleunten, be.sohleunten), NULL) AS sohleunten,
    iif(coalesce(abs(be.baujahr - ex.baujahr), 0) > 0.001, printf('%.d -> %.d', ex.baujahr, be.baujahr), NULL) AS baujahr,
    iif(be.haltnam <> ex.haltnam, printf('%s -> %s', be.haltnam, ex.haltnam), NULL) AS haltnam,
    iif(be.teilgebiet <> ex.teilgebiet, printf('%s -> %s', be.teilgebiet, ex.teilgebiet), NULL) AS teilgebiet,
    iif(be.strasse <> ex.strasse, printf('%s -> %s', be.strasse, ex.strasse), NULL) AS strasse,
    iif(be.profilnam <> ex.profilnam, printf('%s -> %s', be.profilnam, ex.profilnam), NULL) AS profilnam,
    iif(be.entwart <> ex.entwart, printf('%s -> %s', be.entwart, ex.entwart), NULL) AS entwart,
    iif(be.material <> ex.material, printf('%s -> %s', be.material, ex.material), NULL) AS material,
    iif(be.profilauskleidung <> ex.profilauskleidung, printf('%s -> %s', be.profilauskleidung, ex.profilauskleidung), NULL) AS profilauskleidung,
    iif(be.innenmaterial <> ex.innenmaterial, printf('%s -> %s', be.innenmaterial, ex.innenmaterial), NULL) AS innenmaterial,
    iif(be.ks <> ex.ks, printf('%.4f -> %.4f', ex.ks, be.ks), NULL) AS ks,
    iif(be.anschlusstyp <> ex.anschlusstyp, printf('%s -> %s', be.anschlusstyp, ex.anschlusstyp), NULL) AS anschlusstyp,
    iif(be.simstatus <> ex.simstatus, printf('%s -> %s', be.simstatus, ex.simstatus), NULL) AS simstatus,
    iif(be.kommentar <> ex.kommentar, printf('%s -> %s', be.kommentar, ex.kommentar), NULL) AS kommentar,
    iif(abs(Julianday(be.createdat) - Julianday(ex.createdat)) > 0.5, printf('%s -> %s', ex.createdat, be.createdat), NULL) AS createdat,
    be.geom AS geom
FROM (
    SELECT * 
    FROM main.anschlussleitungen AS a
    WHERE NOT :seltgb
       OR a.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY a.leitnam
   HAVING count() = 1
) AS be
JOIN (
    SELECT * 
    FROM ext.anschlussleitungen AS a
    WHERE NOT :seltgb
       OR a.teilgebiet IN (SELECT tgnam FROM sel_teilgebiete)
   GROUP BY a.leitnam
   HAVING count() = 1
) AS ex ON ex.leitnam = be.leitnam
WHERE
    coalesce(abs(be.schoben - ex.schoben), 0) > 0.001 OR
    coalesce(abs(be.schunten - ex.schunten), 0) > 0.001 OR
    coalesce(abs(be.hoehe - ex.hoehe), 0) > 0.001 OR
    coalesce(abs(be.breite - ex.breite), 0) > 0.001 OR
    coalesce(abs(be.laenge - ex.laenge), 0) > 0.001 OR
    coalesce(abs(be.aussendurchmesser - ex.aussendurchmesser), 0) > 0.001 OR
    coalesce(abs(be.sohleoben - ex.sohleoben), 0) > 0.001 OR
    coalesce(abs(be.sohleunten - ex.sohleunten), 0) > 0.001 OR
    coalesce(abs(be.baujahr - ex.baujahr), 0) > 0.001 OR
    be.haltnam <> ex.haltnam OR
    be.teilgebiet <> ex.teilgebiet OR
    be.strasse <> ex.strasse OR
    be.profilnam <> ex.profilnam OR
    be.entwart <> ex.entwart OR
    be.material <> ex.material OR
    be.profilauskleidung <> ex.profilauskleidung OR
    be.innenmaterial <> ex.innenmaterial OR
    be.ks <> ex.ks OR
    be.anschlusstyp <> ex.anschlusstyp OR
    be.simstatus <> ex.simstatus OR
    be.kommentar <> ex.kommentar OR
    abs(Julianday(be.createdat) - Julianday(ex.createdat)) > 0.5 OR
    be.geom <> ex.geom;"

sync_create_sel_teilgebiete: "
CREATE TEMP TABLE IF NOT EXISTS sel_teilgebiete (tgnam TEXT PRIMARY KEY)"

sync_sel_teilgebiete_reset: "
DELETE FROM sel_teilgebiete;"

sync_sel_teilgebiete_add: "
INSERT INTO sel_teilgebiete VALUES (?);"


# Synchronisation der bestätigten Änderungen

# Haltungen hinzufügen
sync_haltungen_add: "
INSERT INTO main.haltungen (
    haltnam, schoben, schunten, hoehe, breite, laenge, aussendurchmesser, sohleoben, sohleunten,
    baujahr, eigentum, teilgebiet, strasse, profilnam, entwart, material, profilauskleidung,
    innenmaterial, ks, haltungstyp, simstatus, rwanschluss, druckdicht,
    kommentar, createdat, geom) 
SELECT
    ex.haltnam, ex.schoben, ex.schunten, ex.hoehe, ex.breite, ex.laenge, ex.aussendurchmesser, ex.sohleoben, ex.sohleunten,
    ex.baujahr, ex.eigentum, ex.teilgebiet, ex.strasse, ex.profilnam, ex.entwart, ex.material, ex.profilauskleidung,
    ex.innenmaterial, ex.ks, ex.haltungstyp, ex.simstatus, ex.rwanschluss, ex.druckdicht,
    ex.kommentar, ex.createdat, ex.geom
FROM ext.haltungen AS ex
JOIN sync_haltungen AS sy ON ex.pk = sy.pk_ext
WHERE sy.aktion = 'hinzufügen' 
  AND sy.status;"

# Haltungen löschen
sync_haltungen_del: "
DELETE FROM main.haltungen
WHERE pk IN (
    SELECT pk_best
    FROM sync_haltungen
    WHERE aktion = 'löschen'
      AND status
);"

# Haltungen ändern
sync_haltungen_mod: "
UPDATE main.haltungen
SET
    schoben = mo.schoben,
    schunten = mo.schunten,
    hoehe = mo.hoehe,
    breite = mo.breite,
    laenge = mo.laenge,
    aussendurchmesser = mo.aussendurchmesser,
    sohleoben = mo.sohleoben,
    sohleunten = mo.sohleunten,
    baujahr = mo.baujahr,
    eigentum = mo.eigentum,
    teilgebiet = mo.teilgebiet,
    strasse = mo.strasse,
    profilnam = mo.profilnam,
    entwart = mo.entwart,
    material = mo.material,
    profilauskleidung = mo.profilauskleidung,
    innenmaterial = mo.innenmaterial,
    ks = mo.ks,
    haltungstyp = mo.haltungstyp,
    simstatus = mo.simstatus,
    rwanschluss = mo.rwanschluss,
    druckdicht = mo.druckdicht,
    kommentar = mo.kommentar,
    createdat = mo.createdat,
    geom = mo.geom
FROM (
    SELECT
        sy.pk_best AS pk_best,
        iif(sy.schoben IS NOT NULL AND sy.schoben <> '', ex.schoben, be.schoben) AS schoben,
        iif(sy.schunten IS NOT NULL AND sy.schunten <> '', ex.schunten, be.schunten) AS schunten,
        iif(sy.hoehe IS NOT NULL, ex.hoehe, be.hoehe) AS hoehe,
        iif(sy.breite IS NOT NULL, ex.breite, be.breite) AS breite,
        iif(sy.laenge IS NOT NULL, ex.laenge, be.laenge) AS laenge,
        iif(sy.aussendurchmesser IS NOT NULL, ex.aussendurchmesser, be.aussendurchmesser) AS aussendurchmesser,
        iif(sy.sohleoben IS NOT NULL, ex.sohleoben, be.sohleoben) AS sohleoben,
        iif(sy.sohleunten IS NOT NULL, ex.sohleunten, be.sohleunten) AS sohleunten,
        iif(sy.baujahr IS NOT NULL, ex.baujahr, be.baujahr) AS baujahr,
        iif(sy.eigentum IS NOT NULL AND sy.eigentum <> '', ex.eigentum, be.eigentum) AS eigentum,
        iif(sy.teilgebiet IS NOT NULL AND sy.teilgebiet <> '', ex.teilgebiet, be.teilgebiet) AS teilgebiet,
        iif(sy.strasse IS NOT NULL AND sy.strasse <> '', ex.strasse, be.strasse) AS strasse,
        iif(sy.profilnam IS NOT NULL AND sy.profilnam <> '', ex.profilnam, be.profilnam) AS profilnam,
        iif(sy.entwart IS NOT NULL AND sy.entwart <> '', ex.entwart, be.entwart) AS entwart,
        iif(sy.material IS NOT NULL AND sy.material <> '', ex.material, be.material) AS material,
        iif(sy.profilauskleidung IS NOT NULL AND sy.profilauskleidung <> '', ex.profilauskleidung, be.profilauskleidung) AS profilauskleidung,
        iif(sy.innenmaterial IS NOT NULL AND sy.innenmaterial <> '', ex.innenmaterial, be.innenmaterial) AS innenmaterial,
        iif(sy.ks IS NOT NULL, ex.ks, be.ks) AS ks,
        iif(sy.haltungstyp IS NOT NULL AND sy.haltungstyp <> '', ex.haltungstyp, be.haltungstyp) AS haltungstyp,
        iif(sy.simstatus IS NOT NULL AND sy.simstatus <> '', ex.simstatus, be.simstatus) AS simstatus,
        iif(sy.rwanschluss IS NOT NULL, ex.rwanschluss, be.rwanschluss) AS rwanschluss,
        iif(sy.druckdicht IS NOT NULL, ex.druckdicht, be.druckdicht) AS druckdicht,
        iif(sy.kommentar IS NOT NULL AND sy.kommentar <> '', ex.kommentar, be.kommentar) AS kommentar,
        iif(sy.createdat IS NOT NULL AND sy.createdat <> '', ex.createdat, be.createdat) AS createdat,
        iif(sy.objekt IS NOT NULL AND sy.objekt <> '', ex.geom, be.geom) AS geom
    FROM sync_haltungen AS sy
    JOIN main.haltungen AS be ON be.pk = sy.pk_best
    JOIN ext.haltungen AS ex ON ex.pk = sy.pk_ext
    WHERE sy.aktion = 'ändern'
      AND status
) AS mo
WHERE main.haltungen.pk = mo.pk_best;"

sync_haltungen_prot: "
SELECT * FROM sync_haltungen WHERE status
"

# Schächte hinzufügen
sync_schaechte_add: "
INSERT INTO main.schaechte (
    schnam, sohlhoehe, deckelhoehe, durchm, druckdicht, ueberstauflaeche, entwart,
    strasse, baujahr, eigentum, teilgebiet, knotentyp, auslasstyp, schachttyp,
    simstatus, material, xsch, ysch, kommentar, createdat, geom, geop)
SELECT
    ex.schnam, ex.sohlhoehe, ex.deckelhoehe, ex.durchm, ex.druckdicht, ex.ueberstauflaeche, ex.entwart,
    ex.strasse, ex.baujahr, ex.eigentum, ex.teilgebiet, ex.knotentyp, ex.auslasstyp, ex.schachttyp,
    ex.simstatus, ex.material, ex.xsch, ex.ysch, ex.kommentar, ex.createdat, CastToMultiLineString(ex.geom) AS geom, ex.geop
FROM ext.schaechte AS ex
JOIN sync_schaechte AS sy ON ex.pk = sy.pk_ext
WHERE sy.aktion = 'hinzufügen' 
  AND sy.status;"

# Schächte löschen
sync_schaechte_del: "
DELETE FROM main.schaechte
WHERE pk IN (
    SELECT pk_best
    FROM sync_schaechte
    WHERE aktion = 'löschen'
      AND status
);"

# Schächte ändern
sync_schaechte_mod: "
UPDATE main.schaechte
SET
    sohlhoehe = mo.sohlhoehe,
    deckelhoehe = mo.deckelhoehe,
    durchm = mo.durchm,
    druckdicht = mo.druckdicht,
    ueberstauflaeche = mo.ueberstauflaeche,
    entwart = mo.entwart,
    strasse = mo.strasse,
    baujahr = mo.baujahr,
    eigentum = mo.eigentum,
    teilgebiet = mo.teilgebiet,
    knotentyp = mo.knotentyp,
    auslasstyp = mo.auslasstyp,
    schachttyp = mo.schachttyp,
    simstatus = mo.simstatus,
    material = mo.material,
    xsch = mo.xsch,
    ysch = mo.ysch,
    kommentar = mo.kommentar,
    createdat = mo.createdat,
    geom = mo.geom,
    geop = mo.geop
FROM (
    SELECT
        sy.pk_best AS pk_best,
        iif(sy.sohlhoehe IS NOT NULL, ex.sohlhoehe, be.sohlhoehe) AS sohlhoehe,
        iif(sy.deckelhoehe IS NOT NULL, ex.deckelhoehe, be.deckelhoehe) AS deckelhoehe,
        iif(sy.durchm IS NOT NULL, ex.durchm, be.durchm) AS durchm,
        iif(sy.druckdicht IS NOT NULL, ex.druckdicht, be.druckdicht) AS druckdicht,
        iif(sy.ueberstauflaeche IS NOT NULL, ex.ueberstauflaeche, be.ueberstauflaeche) AS ueberstauflaeche,
        iif(sy.entwart IS NOT NULL AND sy.entwart <> '', ex.entwart, be.entwart) AS entwart,
        iif(sy.strasse IS NOT NULL AND sy.strasse <> '', ex.strasse, be.strasse) AS strasse,
        iif(sy.baujahr IS NOT NULL, ex.baujahr, be.baujahr) AS baujahr,
        iif(sy.eigentum IS NOT NULL AND sy.eigentum <> '', ex.eigentum, be.eigentum) AS eigentum,
        iif(sy.teilgebiet IS NOT NULL AND sy.teilgebiet <> '', ex.teilgebiet, be.teilgebiet) AS teilgebiet,
        iif(sy.knotentyp IS NOT NULL AND sy.knotentyp <> '', ex.knotentyp, be.knotentyp) AS knotentyp,
        iif(sy.auslasstyp IS NOT NULL AND sy.auslasstyp <> '', ex.auslasstyp, be.auslasstyp) AS auslasstyp,
        iif(sy.schachttyp IS NOT NULL AND sy.schachttyp <> '', ex.schachttyp, be.schachttyp) AS schachttyp,
        iif(sy.simstatus IS NOT NULL AND sy.simstatus <> '', ex.simstatus, be.simstatus) AS simstatus,
        iif(sy.material IS NOT NULL AND sy.material <> '', ex.material, be.material) AS material,
        iif(sy.xsch IS NOT NULL, ex.xsch, be.xsch) AS xsch,
        iif(sy.ysch IS NOT NULL, ex.ysch, be.ysch) AS ysch,
        iif(sy.kommentar IS NOT NULL AND sy.kommentar <> '', ex.kommentar, be.kommentar) AS kommentar,
        iif(sy.createdat IS NOT NULL AND sy.createdat <> '', ex.createdat, be.createdat) AS createdat,
        iif(sy.grafikobjekt IS NOT NULL AND sy.grafikobjekt <> '', CastToMultiLineString(ex.geom), CastToMultiLineString(ex.geom)) AS geom,
        iif(sy.punktobjekt IS NOT NULL AND sy.punktobjekt <> '', ex.geop, be.geop) AS geop      /* only geom in table sync */
    FROM sync_schaechte AS sy
    JOIN main.schaechte AS be ON be.pk = sy.pk_best
    JOIN ext.schaechte AS ex ON ex.pk = sy.pk_ext
    WHERE sy.aktion = 'ändern'
      AND status
) AS mo
WHERE main.schaechte.pk = mo.pk_best;"

sync_schaechte_prot: "
SELECT * FROM sync_schaechte WHERE status
"

# Anschlussleitungen hinzufügen
sync_anschlussleitungen_add: "
INSERT INTO main.anschlussleitungen (
    schoben, schunten, hoehe, breite, laenge, aussendurchmesser, sohleoben, sohleunten,
    baujahr, haltnam, teilgebiet, strasse, profilnam, entwart, material, profilauskleidung,
    innenmaterial, ks, anschlusstyp, simstatus, kommentar, createdat, geom) 
SELECT
    ex.schoben , ex.schunten , ex.hoehe , ex.breite , ex.laenge , ex.aussendurchmesser , ex.sohleoben , ex.sohleunten,
    ex.baujahr , ex.haltnam , ex.teilgebiet , ex.strasse , ex.profilnam , ex.entwart , ex.material , ex.profilauskleidung,
    ex.innenmaterial , ex.ks , ex.anschlusstyp , ex.simstatus , ex.kommentar , ex.createdat , ex.geom
FROM ext.anschlussleitungen AS ex
JOIN sync_anschlussleitungen AS sy ON ex.pk = sy.pk_ext
WHERE sy.aktion = 'hinzufügen' 
  AND sy.status;"

# Anschlussleitungen löschen
sync_anschlussleitungen_del: "
DELETE FROM main.anschlussleitungen
WHERE pk IN (
    SELECT pk_best
    FROM sync_anschlussleitungen
    WHERE aktion = 'löschen'
      AND status
);"

# Anschlussleitungen ändern
sync_anschlussleitungen_mod: "
UPDATE main.anschlussleitungen
SET
    schoben = mo.schoben,
    schunten = mo.schunten,
    hoehe = mo.hoehe,
    breite = mo.breite,
    laenge = mo.laenge,
    aussendurchmesser = mo.aussendurchmesser,
    sohleoben = mo.sohleoben,
    sohleunten = mo.sohleunten,
    baujahr = mo.baujahr,
    haltnam = mo.haltnam,
    teilgebiet = mo.teilgebiet,
    strasse = mo.strasse,
    profilnam = mo.profilnam,
    entwart = mo.entwart,
    material = mo.material,
    profilauskleidung = mo.profilauskleidung,
    innenmaterial = mo.innenmaterial,
    ks = mo.ks,
    anschlusstyp = mo.anschlusstyp,
    simstatus = mo.simstatus,
    kommentar = mo.kommentar,
    createdat = mo.createdat,
    geom = mo.geom
FROM (
    SELECT
        sy.pk_best AS pk_best,
        iif(sy.schoben IS NOT NULL AND sy.schoben <> '', ex.schoben, be.schoben) AS schoben,
        iif(sy.schunten IS NOT NULL AND sy.schunten <> '', ex.schunten, be.schunten) AS schunten,
        iif(sy.hoehe IS NOT NULL, ex.hoehe, be.hoehe) AS hoehe,
        iif(sy.breite IS NOT NULL, ex.breite, be.breite) AS breite,
        iif(sy.laenge IS NOT NULL, ex.laenge, be.laenge) AS laenge,
        iif(sy.aussendurchmesser IS NOT NULL, ex.aussendurchmesser, be.aussendurchmesser) AS aussendurchmesser,
        iif(sy.sohleoben IS NOT NULL, ex.sohleoben, be.sohleoben) AS sohleoben,
        iif(sy.sohleunten IS NOT NULL, ex.sohleunten, be.sohleunten) AS sohleunten,
        iif(sy.baujahr IS NOT NULL, ex.baujahr, be.baujahr) AS baujahr,
        iif(sy.haltnam IS NOT NULL AND sy.haltnam <> '', ex.haltnam, be.haltnam) AS haltnam,
        iif(sy.teilgebiet IS NOT NULL AND sy.teilgebiet <> '', ex.teilgebiet, be.teilgebiet) AS teilgebiet,
        iif(sy.strasse IS NOT NULL AND sy.strasse <> '', ex.strasse, be.strasse) AS strasse,
        iif(sy.profilnam IS NOT NULL AND sy.profilnam <> '', ex.profilnam, be.profilnam) AS profilnam,
        iif(sy.entwart IS NOT NULL AND sy.entwart <> '', ex.entwart, be.entwart) AS entwart,
        iif(sy.material IS NOT NULL AND sy.material <> '', ex.material, be.material) AS material,
        iif(sy.profilauskleidung IS NOT NULL AND sy.profilauskleidung <> '', ex.profilauskleidung, be.profilauskleidung) AS profilauskleidung,
        iif(sy.innenmaterial IS NOT NULL AND sy.innenmaterial <> '', ex.innenmaterial, be.innenmaterial) AS innenmaterial,
        iif(sy.ks IS NOT NULL, ex.ks, be.ks) AS ks,
        iif(sy.anschlusstyp IS NOT NULL AND sy.anschlusstyp <> '', ex.anschlusstyp, be.anschlusstyp) AS anschlusstyp,
        iif(sy.simstatus IS NOT NULL AND sy.simstatus <> '', ex.simstatus, be.simstatus) AS simstatus,
        iif(sy.kommentar IS NOT NULL AND sy.kommentar <> '', ex.kommentar, be.kommentar) AS kommentar,
        iif(sy.createdat IS NOT NULL AND sy.createdat <> '', ex.createdat, be.createdat) AS createdat,
        iif(sy.objekt IS NOT NULL AND sy.objekt <> '', ex.geom, be.geom) AS geom
    FROM sync_anschlussleitungen AS sy
    JOIN main.anschlussleitungen AS be ON be.pk = sy.pk_best
    JOIN ext.anschlussleitungen AS ex ON ex.pk = sy.pk_ext
    WHERE sy.aktion = 'ändern'
      AND status
) AS mo
WHERE main.anschlussleitungen.pk = mo.pk_best;"

sync_anschlussleitungen_prot: "
SELECT * FROM sync_haltungen WHERE status
"
