Query von FB2 zu FB3 Fehler

ny_unity

SQL-Guru
Beiträge
185
Hallo,

erstmal ein gesundes neues Jahr zusammen!

Mein Chef hat im Zuge des Weihnachtsfrieden von Firebird 2 auf Firebird 3 gewechselt. Lief soweit wohl alles erfolgreich, Programme laufen.

Meine Datenbankabfragen laufen aber größtenteils gegen die Wand. Ich konnte jetzt auch schon den Verursacher eingrenzen... eine einfache Abfrage die in FB2 lief:

Code:
SELECT    ep.personalnr, ep.auftragnr, TRIM(p.nachname) AS nachname, TRIM(p.VORNAME) AS vorname, CASE WHEN ep.bezeichn IS NULL THEN TRIM(p.einstberuftext) ELSE TRIM(ep.bezeichn) END AS bezeichn, k.kundennr, TRIM(k.kundname) AS kundname, CASE WHEN k.disponent IS NULL OR k.disponent = '' THEN '- Keiner -' ELSE TRIM(k.disponent) END AS dispoku, ep.datumvon, ep.datumbis
FROM einspers ep, personal p, auftrag a, kunden k
INNER JOIN     (
        SELECT ep.personalnr, MAX(ep.datumbis) AS datumbis
        FROM einspers ep
        WHERE ep.datumvon <= TIMESTAMP 'TODAY' AND ep.auftragnr >0
        GROUP BY ep.personalnr
        ) ep1 ON ep.personalnr = ep1.personalnr AND ep.datumbis = ep1.datumbis
WHERE p.internpers = 'N' AND p.persstatus = 2 AND p.personalnr = ep.personalnr AND ep.auftragnr >0 AND ep.auftragnr = a.auftragnr AND k.kundennr = a.kundennr

Das Problem liegt am INNER JOIN. Er nimmt das nicht an, bringt Fehler, dass er ep.datumbis nicht finden kann, habe auch getestet, die Tabellen umzunennen.

Was funkltionierte, war das ganze in WITH aufzusplitten:

Code:
SELECT * 
FROM
    (
    WITH tb_einsatz AS
        (
        SELECT    ep.personalnr, ep.auftragnr, TRIM(p.nachname) AS nachname, TRIM(p.VORNAME) AS vorname, CASE WHEN ep.bezeichn IS NULL THEN TRIM(p.einstberuftext) ELSE TRIM(ep.bezeichn) END AS bezeichn, k.kundennr, TRIM(k.kundname) AS kundname, CASE WHEN k.disponent IS NULL OR k.disponent = '' THEN '- Keiner -' ELSE TRIM(k.disponent) END AS dispoku, ep.datumvon, ep.datumbis
        FROM einspers ep, personal p, auftrag a, kunden k
        WHERE p.internpers = 'N' AND p.persstatus = 2 AND p.personalnr = ep.personalnr AND ep.auftragnr >0 AND ep.auftragnr = a.auftragnr AND k.kundennr = a.kundennr
        )
    , tb_letzter_einsatz AS
        (
        SELECT ep.personalnr, MAX(ep.datumbis) AS datumbis
        FROM einspers ep
        WHERE ep.datumvon <= TIMESTAMP 'TODAY' AND ep.auftragnr >0
        GROUP BY ep.personalnr
        )
    SELECT ei.*
    FROM tb_einsatz ei, tb_letzter_einsatz le
    WHERE ei.personalnr = le.personalnr AND ei.datumbis = le.datumbis
    )

Besteht die Möglichkeit den INNER JOIN mit einer erstellten Tabelle zu nutzen? Oder bleibt nur noch die WITH Table Variante?

Danke,

MfG

Erik
 
Werbung:
Du solltest die veralteten impliziten Joins (im WHERE) nicht mit den "modernen" (mehr als 25 Jahre alt) Joins mischen. Vermutlich kommt daher das Problem.
Code:
SELECT ...
FROM einspers ep
  join personal p ON p.personalnr = ep.personalnr
  join auftrag a ON ep.auftragnr = a.auftragnr
  join kunden k ON k.kundennr = a.kundennr
  JOIN (
    SELECT ep2.personalnr, MAX(ep2.datumbis) AS datumbis
    FROM einspers ep2 -- ich würde sicherheitshalber einen eindeutigen Alias verwenden
    WHERE ep2.datumvon <= TIMESTAMP 'TODAY'
      AND ep2.auftragnr > 0
    GROUP BY ep2.personalnr
  ) ep1 ON ep.personalnr = ep1.personalnr AND ep.datumbis = ep1.datumbis
WHERE p.internpers = 'N'
  AND p.persstatus = 2
  AND ep.auftragnr >0
 
Werbung:
Zurück
Oben