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

SQL Abfrage: JOIN mit Tabelle ohne Relationen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von smiso, 7 Juni 2019.

  1. smiso

    smiso Benutzer

    Hallo zusammen,

    Ich komme bei einer Abfrage nicht weiter und weiss auch nicht, ob die überhaupt machbar ist und wie ich danach suchen soll.

    Es sind 3 Tabellen:
    Kalkulationen (ZUS_Calc, Kopf)
    Positionen (ZUS_CalcPos, Relationen zu Kalkulationen und Positionstypen)
    Positionstypen (ZUS_CalcTypen, keine Relationen)

    In der Applikation werden zu einer Kalkulation immer alle Positionstypen angezeigt und es können Werte in die Tabelle Positionen gespeichert werden. Ich speichere jedoch nur die Positionen, die Werte enthalten. Das heisst, es gibt pro Kalkulation nicht für jeden Positionstyp eine Position.

    Nun sollte das Ganze ausgewertet werden können und ich sollte für jede Kalkulation eine Zeile pro Positionstyp haben - mit oder ohne Werte. Für eine einzelne Kalkulation klappt dies wunderbar (zur Info: ich bin nicht ganz frei zum schreiben des SQL Statements, da dieses über eine Applikation generiert wird. Deshalb hier der Umweg mit "LEFT JOIN ZUS_CalcTypen.ImportNr = ZUS_CalcTypen.ImportNr"):
    Code:
    SELECT ZUS_Calc.Version, ZUS_CalcTypen.Name, ZUS_CalcTypen.TypID, ZUS_CalcPos.TypID
    FROM ZUS_Calc
    LEFT JOIN  ZUS_CalcTypen.ImportNr = ZUS_CalcTypen.ImportNr
    LEFT JOIN  ZUS_CalcPos ON ZUS_CalcTypen.TypID = ZUS_CalcPos.TypID
    WHERE ZUS_Calc.Version > 999 AND ZUS_CalcTypen.NkSort > 0 AND ( ZUS_CalcPos.CalcID = ZUS_Calc.CalcID OR ZUS_CalcPos.CalcID IS NULL ) AND ZUS_Calc.PositionNrBAS = 309
    ORDER BY ZUS_Calc.PositionNrBAS,ZUS_CalcTypen.NkSort
    
    Wenn ich allerdings mehrere Kalkulationen auslese (ohne AND ZUS_Calc.PositionNrBAS = 309), klappt dies natürlich nicht mehr. Gibt es dafür eine schlaue Lösung? Hast jemand eine Idee?

    Vielen Dank und Grüsse
    Dani
     
  2. ukulele

    ukulele Datenbank-Guru

    Dann gibt es aber nur zwei Möglichkeiten: Entweder beinhaltet deine Tabelle Positionstypen noch einen Fremdschlüssel auf Kalkulationen so das eine 1:n-Verknüpfung existiert oder du machst mit jeder Kalkulation zu jedem Positionstypen einen CROSS JOIN (jeder Datensatz zu jedem Datensatz) ohne Bedingung. Ansonsten gibt es keinen Bezug wenn in Positionen nichts eingetragen ist.

    Ich hoffe das ist wirklich nur ein Notnagel denn LEFT JOIN ... ON 1=1 ist ja irgendwie Blödsinn.

    Hier mal mein Ansatz:
    Code:
    SELECT ZUS_Calc.Version, ZUS_CalcTypen.Name, ZUS_CalcTypen.TypID, ZUS_CalcPos.TypID
    FROM ZUS_Calc
    CROSS JOIN ZUS_CalcTypen
    LEFT JOIN  ZUS_CalcPos
    ON ZUS_CalcPos.CalcID = ZUS_Calc.CalcID
    AND ZUS_CalcPos.TypID = ZUS_CalcTypen.TypID
    WHERE ZUS_Calc.Version > 999 AND ZUS_CalcTypen.NkSort > 0 AND ZUS_Calc.PositionNrBAS = 309
    ORDER BY ZUS_Calc.PositionNrBAS,ZUS_CalcTypen.NkSort
    
     
  3. smiso

    smiso Benutzer

    Vielen Dank ukulele!

    Das funktioniert so.

    Es ist so, dass die Positionstypen keine Relation zur Kalkulation haben. Die Erklärung folgt gleich:

    Es geht dabei um eine SQL-Definition für einen List&Label Report. Die Software hat eine Oberfläche, auf der die Verknüpfungen zusammengeklickt werden kann. Ich habe dabei das Problem, dass ich keinen CROSS JOIN anlegen kann. LEFT JOIN ... ON 1=1 verhält sich aber gleich und funktioniert mit Deinem Vorschlag auch.

    Mein wirkliches Problem ist nun, dass ich beim JOIN im Gui keinen zweiten Vergleich realisieren kann. Gibt es eine Variante, entweder "ZUS_CalcPos.CalcID = ZUS_Calc.CalcID" oder "ZUS_CalcPos.TypID = ZUS_CalcTypen.TypID" in der WHERE Klausel abzubilden, so dass das Ganze funktioniert?
     
  4. ukulele

    ukulele Datenbank-Guru

    Ich kenne L&L, habe ich als Bestandteil vom Combit CRM auch. Die GUI kann viel aber natürlich nicht alles genau so wie SQL. Ich hab diese Probleme immer umgangen und wir einfach die Daten als SQL View angelegt, so wie ich sie benötige. Darauf habe ich dann mit L&L aufgesetzt und das wie eine Tabelle behandelt. Funktioniert meistens ganz gut.

    Du kannst keine 2 Bedingungen in einer ON-Condition angeben? Letzteres kenne ich gut, ist oft bei Software so die SQL nicht einfach durchreicht... Man könnte es eventuell sehr umständlich anders bauen, würde glaube ich auch ein UNION voraus setzen. Ich würde meinen Umweg über eine View bevorzugen.
     
  5. smiso

    smiso Benutzer

    Vielen Dank für die Antwort.

    Ich konnte dies mit einer View lösen. Das hätte mit auch in den Sinn kommen können. Allerdings sind Views in der Software noch nicht lange möglich und es ist nun das erste Mal, dass ich es so lösen musste.
     
  6. ukulele

    ukulele Datenbank-Guru

    Welche Software ist das wenn ich fragen darf?

    Wie gesagt ich nutze L&L (in einer recht alten Version) auch in kleinem Umfang als Bestandteil meines CRMs. Das behandelt Views wie Tabellen und kann auch versuchen da rein zu schreiben. In sofern vermute ich das L&L den Unterscheid zwischen Tabellen und Views nicht wirklich kennt, ergo alles gleich behandeln müsste...
     
  7. smiso

    smiso Benutzer

    Es ist die schweizer ERP-Software PROFFIX. Da gibt es ein Fenster, in dem die ganzen Informationen/Einstellungen zu einer Liste definiert werden können. Daraus werden dann die SQL's automatisch generiert. Es gibt lediglich für WHERE, GROUP BY und ORDER BY Felder, die individuell abgefüllt werden können. Sonst kann ich wählen, welche Tabellen ich anziehen möchte und über eine Liste die Relationen bestimmen. Views standen darin ganz lange einfach nicht zur Verfügung.
     
  8. ukulele

    ukulele Datenbank-Guru

    Okay aber dann geht es ja jetzt und die View sollte nur einen geringen Mehraufwand darstellen aber dir viele Möglichkeiten eröffnen.
     
  9. smiso

    smiso Benutzer

    Genau... vielen Dank für Deine Unterstützung!
     
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