1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Query von FB2 zu FB3 Fehler

Dieses Thema im Forum "Firebird und Interbase" wurde erstellt von ny_unity, 6 Januar 2020.

  1. ny_unity

    ny_unity Datenbank-Guru

    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
     
  2. castorp

    castorp Datenbank-Guru

    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
     
    ny_unity gefällt das.
  3. ny_unity

    ny_unity Datenbank-Guru

    in der Tat. Daran lag / liegt es.

    Vielen Dank!

    jetzt kommt ne Menge Arbeit auf mich zu... :eek::oops:
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden