Äh wie jetzt?
Du hast eine Master-Tabelle
Wert1 Wert2
===== =====
Rolf 1
TS 2
MudGuard 1
Trezimann 2
Und dann zwei Zusatztabellen tab_1 und tab_2, und du bekommt einen Join hin, der für mich und MudGuard Zusatzwerte aus tab_1 liest, und für dich und Trezimann die Werte aus tab_2 ? Und zwar ohne UNION?
Kannst Du das man zeigen?
An Treziman: Mir wäre nicht bekannt, dass der SQL Standard einen Zugriff auf variable Tabellennamen vorsieht. Mich würde interessieren, welche Query bei Dir grundsätzlich funktioniert hat, bevor Du auf dynamische Tabellen erweitern wolltest.
Eine Lösung kann es geben, wenn man einen SQL Server hat, der Stored Procedures als Funktionen vorsieht, die man dann als Ergebnisspalten einbauen kann. Innerhalb dieser Funktionen kann man dann entweder eine Fallunterscheidung nach Wert2 machen und auf eine konkrete Tabelle zugreifen, oder man erzeugt darin ein dynamisches SQL Statement als String und führt das aus. Letzteres ist allerdings ein Performancekiller, weil dieses Statement dann jedesmal neu übersetzt und gebunden werden muss. Die Art der Realisierung hängt dann auch am konkreten SQL Server - hast Du MS SQL? IBM UDB? PostGreSQL? MySQL?
Für eine SINNVOLLE Lösung müsste man auch noch wissen, wie die Verknüpfungsregel zwischen tabelle1 und den Zusatztabellen sein soll. Du hast keine hingeschrieben, d.h. es gibt ein kartesisches Produkt. Das ist vermutlich nicht, was Du willst. Und du hast keine Spalten aus der Zusatztabelle im SELECT, d.h. der einzige Effekt wäre eigentlich, dass jede Zeile aus tabelle1 N-fach in die Ausgabe kommt (mit N=Anzahl Zeilen in der jeweiligen Zusatztabelle).
Für einen Vorschlag nehme ich daher mal an, dass
- die Zusatztabellen zwei Spalten Zusatz1 und Zusatz2 haben, die in die Ausgabe kommen sollen
- die Zusatztabellen strukturgleich sind
- der Wertebereich für tabelle1.Wert2 festgelegt ist (z.B. 'a', 'b', 'c' und 'd').
In dem Fall könnte man es so lösen. Beachte, dass die ON Bedingung nur dafür sorgt, dass die relevanten Zeilen aus tabelle1 in Bezug gesetzt werden, es fehlt definitiv eine richtige Join-Bedingung um das kartesische Produkt zu vermeiden. Es sei denn, du willst das unbedingt.
SELECT a.wert1, a.wert2, a.wert3, z.zusatz1, z.zusatz2
FROM tabelle1 AS a JOIN tabelle_a AS z ON a.wert2 = 'a'
WHERE a.wert1 = 0 AND a.wert3 >= x AND z.werta = y
UNION ALL
SELECT a.wert1, a.wert2, a.wert3, z.zusatz1, z.zusatz2
FROM tabelle1 a JOIN tabelle_b AS z ON a.wert2 = 'b'
WHERE a.wert1 = 0 AND a.wert3 >= x AND z.werta = y
UNION ALL
SELECT a.wert1, a.wert2, a.wert3, z.zusatz1, z.zusatz2
FROM tabelle1 AS a JOIN tabelle_c AS z ON a.wert2 = 'c'
WHERE a.wert1 = 0 AND a.wert3 >= x AND z.werta = y
UNION ALL
SELECT a.wert1, a.wert2, a.wert3, z.zusatz1, z.zusatz2
FROM tabelle1 AS a JOIN tabelle_d AS z ON a.wert2 = 'd'
WHERE a.wert1 = 0 AND a.wert3 >= x AND z.werta = y
ORDER BY datum DESC
Aber wenn es dir irgendwie möglich ist, halte Dich an MudGuards Vorschlag: Fasse die Subtabellen zu einer zusammen, füge eine Spalte "wert2" hinzu und joine über Wert2.
Rolf