Hallo,
ich habe eine Abfrage über einen Foreign Data Wrapper aus einer MS-SQL-Datenbank (latin1) erstellt. Genauer gesagt über zwei Wrapper, die beide über ODBC-Laufen.
- ogr_fdw
- odbc_fdw
Im 1. Fall läuft die Abfrage ganz gut, benötigt aber sehr lange bis alles ausgewertet ist. Aktuell läuft das in eine Materialized View und wird 2x am Tag aktualisiert.
Im 2. Fall läuft die Abfrage schneller (11Sek). Hier liegt die Datenbank in PostgreSQL auch in Latin1 vor. ABER, es werden in einer Spalte keine Ergebnisse ausgegeben.
Hier mal die komplette Abfrage:
SELECT row_number() OVER (ORDER BY gv."FELD30") AS fid,
gv."FELD1" AS jahr,
gv."FELD3" AS az,
gv."FELD2" AS og,
gv."FELD15" AS titel,
gv."FELD19" AS name1,
gv."FELD20" AS name2,
gv."FELD4" AS bemerk,
gv."FELD31" AS bearb,
gv."FELD35" AS art,
gv."FELD36" AS vorh,
gv."FELD10" AS detail,
gv."FELD9" AS art_2,
gv."FELD30" AS re,
gv."FELD29" AS ho,
vd."BAUGENEHMIGUNG" AS genehmigt,
vvs."Value" AS bescheinigt,
vvs."Zeile_id",
vg."Id",
concat(gv."FELD1", '_', gv."FELD3", '_', gv."FELD2") AS pid,
vg."Id" AS vgid,
vk."Veraltet",
st_setsrid(st_makepoint(NULLIF(replace(gv."FELD30"::text, ','::text, '.'::text), ''::text)::numeric::double precision, NULLIF(replace(gv."FELD29"::text, ','::text, '.'::text), ''::text)::numeric::double precision), 25832)::geometry(Point,25832) AS geom
FROM gisview1 gv
LEFT JOIN pbsvorgang vg ON concat(gv."FELD1", '_', gv."FELD2", '_', gv."FELD3") = concat(vg."Jahr", '_', ( SELECT og."Kuerzel"
FROM pbpobergruppe og
WHERE vg."Obergruppe_id"::text = og."Id"::text), '_', vg."Aktenzeichen")
LEFT JOIN pbsvorgangkataster vk ON vg."Id"::text = vk."Vorgang_Key1"::text AND gv."FELD39" = vk."OrderId"
LEFT JOIN ( SELECT vorgdat."JAHR",
vorgdat."AZ",
vorgdat."OG",
vorgdat."BAUGENEHMIGUNG"
FROM vorgdat
GROUP BY vorgdat."JAHR", vorgdat."OG", vorgdat."AZ", vorgdat."BAUGENEHMIGUNG") vd ON concat(gv."FELD1", '_', gv."FELD2", '_', gv."FELD3") = concat(vd."JAHR", '_', vd."OG", '_', vd."AZ")
LEFT JOIN ( SELECT pbsvorgangverfahrensstand."Vorgang_Key1",
pbsvorgangverfahrensstand."Zeile_id",
pbsvorgangverfahrensstand."Value"
FROM pbsvorgangverfahrensstand
WHERE pbsvorgangverfahrensstand."Zeile_id"::text = '1A52B64F-0B28-11E8-8630-902B34612971'::text) vvs ON vg."Id"::text = vvs."Vorgang_Key1"::text
WHERE gv."FELD29" > 0::double precision AND gv."FELD35" = 1 AND vk."Veraltet" IS NULL OR gv."FELD29" > 0::double precision AND gv."FELD35" = 2 AND vk."Veraltet" IS NULL OR gv."FELD29" > 0::double precision AND gv."FELD35" = 3 AND vk."Veraltet" IS NULL OR gv."FELD29" > 0::double precision AND gv."FELD35" = 4 AND vk."Veraltet" IS NULL OR gv."FELD29" > 0::double precision AND gv."FELD35" = 8 AND vk."Veraltet" IS NULL OR gv."FELD29" > 0::double precision AND gv."FELD35" = 32 AND vk."Veraltet" IS NULL OR gv."FELD29" > 0::double precision AND gv."FELD35" = 40 AND vk."Veraltet" IS NULL OR gv."FELD29" > 0::double precision AND gv."FELD35" = 52 AND vk."Veraltet" IS NULL OR gv."FELD29" > 0::double precision AND gv."FELD35" = 53 AND vk."Veraltet" IS NULL;
Wichtig ist dieser Abschnitt:
concat(vg.“Jahr”, ‘’, ( SELECT og.“Kuerzel”
FROM pbpobergruppe og
WHERE vg.“Obergruppe_id”::text = og.“Id”::text), '’, vg.“Aktenzeichen”)
Lasse ich folgende Abfrage im 1. Fall durchlaufen, erhalte ich eine Korrekte Auswertung:
select concat(vg.Jahr, '_', ( SELECT og.Kuerzel
FROM dbo_pbpobergruppe og
WHERE vg.Obergruppe_id::text = og.Id::text), '_', vg.Aktenzeichen) from dbo_pbsvorgang vg
2019_~_922
2019_~_923
2020_~_773
2020_~_966
Mache ich das im 2. Fall, dann fehlt der Wert aus der mittleren Select-Abfrage ab dem zweiten Ergebnis:
select concat(vg."Jahr", '_', ( SELECT og."Kuerzel"
FROM pbpobergruppe og
WHERE vg."Obergruppe_id"::text = og."Id"::text), '_', vg."Aktenzeichen") from pbsvorgang vg
2019_~_922
2019__923
2020__773
2020__966
Woran kann das liegen? Ich hoffe, ich habe das Problem einigermaßen geschildert. Die Datenbank ist eine Postgres 14.4
Gruß
Nachtrag: Die " in der Abfrage Fall2 sind nötig, da dort auf Groß- und Kleinschreibung geachtet wird.