SQL Abfrage: JOIN mit Tabelle ohne Relationen

smiso

Benutzer
Beiträge
5
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
 
Werbung:
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.
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.

Deshalb hier der Umweg mit "LEFT JOIN ZUS_CalcTypen.ImportNr = ZUS_CalcTypen.ImportNr"
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
 
Vielen Dank ukulele!

Das funktioniert so.

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.
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?
 
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.
 
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.
 
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...
 
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.
 
Okay aber dann geht es ja jetzt und die View sollte nur einen geringen Mehraufwand darstellen aber dir viele Möglichkeiten eröffnen.
 
Werbung:
Zurück
Oben