h00bi
Fleet Admiral
- Registriert
- Aug. 2006
- Beiträge
- 21.325
Hallo zusammen,
ich bennötige einen Schubbs in die richtige Richtung für ein SQL Problem auf einem MSSQL Server.
Hier ein paar Beispieltabellen:
Tabelle Waren:
Tabelle Bestand:
Tabelle Lagerfach:
Als Ausgabe brauche ich alle Produkte mit Bestand in Lager C mit der Angabe des Lagerfachs. Wenn in der Tabelle Lagerfach kein Treffer zum Artikel gefunden wird, brauche ich den Artikel und dessen Bestand in Lager-C trotzdem, aber mit leerer Lagerfachangabe.
Beispiel-Resultset:
CPU-C hat einen Lagerfacheintrag für Lager A, aber nicht für Lager-C, obwohl auf Lager-C Bestand liegt. Trotzdem brauche ich CPU-C im Ergebnis, so wie im Beispiel gezeigt.
Aktuell sieht mein Query so aus:
Select
Waren.PID,
Waren.Produkt,
Bestand.Lager,
Bestand.Menge,
Lagerfach.Fach
FROM Waren
LEFT JOIN Bestand ON Bestand.BID = Waren.PID
LEFT JOIN Lagerfach ON Lagerfach.LID = Waren.PID
where
Bestand.Lager='LAGER-C' and
Bestand.Menge > 0 and
Lagerfach.Lager='LAGER-C'
Damit wird mir aber die 3. Zeile im Resultset verschluckt, weil es dazu keinen Lagerfach Eintrag gibt.
Ich vermute mal die Lösung ist ein oder zwei Sub Query(s) mit einer OR Verknüpfung, aber ich finde nicht den richtigen Ansatz.
ich bennötige einen Schubbs in die richtige Richtung für ein SQL Problem auf einem MSSQL Server.
Hier ein paar Beispieltabellen:
Tabelle Waren:
PID | Produkt |
45661 | SSD 1TB |
45662 | SSD 2TB |
45663 | SSD 4TB |
45664 | SSD 8TB |
45665 | CPU-A |
45666 | CPU-B |
45667 | CPU-C |
45668 | RAM-A |
45669 | RAM-B |
Tabelle Bestand:
BID | Menge | LAGER |
45661 | 124 | LAGER-A |
45662 | 4 | LAGER-B |
45663 | 4 | LAGER-A |
45663 | 24 | LAGER-C |
45664 | 554 | LAGER-C |
45665 | 2858 | LAGER-A |
45666 | 541 | LAGER-B |
45667 | 127 | LAGER-A |
Tabelle Lagerfach:
LID | LAGER | FACH |
45661 | LAGER-A | FACH1 |
45662 | LAGER-B | FACH2 |
45663 | LAGER-C | FACH3 |
45664 | LAGER-C | FACH4 |
45665 | LAGER-A | (NULL) |
45666 | LAGER-B | FACH6 |
45667 | LAGER-A | FACH7 |
Als Ausgabe brauche ich alle Produkte mit Bestand in Lager C mit der Angabe des Lagerfachs. Wenn in der Tabelle Lagerfach kein Treffer zum Artikel gefunden wird, brauche ich den Artikel und dessen Bestand in Lager-C trotzdem, aber mit leerer Lagerfachangabe.
Beispiel-Resultset:
PID | Produkt | Lager | Menge | Fach |
45663 | SSD 4TB | LAGER-C | 24 | FACH3 |
45664 | SSD 8TB | LAGER-C | 554 | FACH4 |
45667 | CPU-C | LAGER-C | 127 |
CPU-C hat einen Lagerfacheintrag für Lager A, aber nicht für Lager-C, obwohl auf Lager-C Bestand liegt. Trotzdem brauche ich CPU-C im Ergebnis, so wie im Beispiel gezeigt.
Aktuell sieht mein Query so aus:
Select
Waren.PID,
Waren.Produkt,
Bestand.Lager,
Bestand.Menge,
Lagerfach.Fach
FROM Waren
LEFT JOIN Bestand ON Bestand.BID = Waren.PID
LEFT JOIN Lagerfach ON Lagerfach.LID = Waren.PID
where
Bestand.Lager='LAGER-C' and
Bestand.Menge > 0 and
Lagerfach.Lager='LAGER-C'
Damit wird mir aber die 3. Zeile im Resultset verschluckt, weil es dazu keinen Lagerfach Eintrag gibt.
Ich vermute mal die Lösung ist ein oder zwei Sub Query(s) mit einer OR Verknüpfung, aber ich finde nicht den richtigen Ansatz.