MSSQL (sub-)Query wenn kein Treffer, dann.....

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:

PIDProdukt
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:
BIDMengeLAGER
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:
LIDLAGERFACH
45661​
LAGER-AFACH1
45662​
LAGER-BFACH2
45663​
LAGER-CFACH3
45664​
LAGER-CFACH4
45665​
LAGER-A(NULL)
45666​
LAGER-BFACH6
45667​
LAGER-AFACH7


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:

PIDProduktLagerMengeFach
45663​
SSD 4TBLAGER-C
24​
FACH3
45664​
SSD 8TBLAGER-C
554​
FACH4
45667​
CPU-CLAGER-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.
 
Der Teil Lagerfach.Lager='LAGER-C' macht aus deinem LEFT JOIN quasi ein INNER JOIN. Workaround: (Lagerfach.Lager='LAGER-C' OR Lagerfach.Lager IS NULL)

Edit: Besser du verschiebst die Conditions in die ON-Clauses der LEFT JOINs:
SQL:
SELECT
    Waren.PID,
    Waren.Produkt
    Bestand.Lager
    Bestand.Menge
    Lagerfach.Fach
FROM
    Waren
    LEFT JOIN Bestand WITH(NOLOCK) ON
        Bestand.BID = Waren.PID AND
        Bestand.Lager='LAGER-C' AND
        Bestand.Menge > 0
    LEFT JOIN Lagerfach WITH(NOLOCK) ON
        Lagerfach.LID = Waren.PID AND
        Lagerfach.Lager='LAGER-C'
 
  • Gefällt mir
Reaktionen: Drexel
Lagerfach.Lager IS NULL sucht aber nach einem NULL Wert in der Tabelle.
Also nach sowas in bold:
LIDLAGERFACH
45661​
LAGER-AFACH1
45662​
LAGER-BFACH2
45663​
LAGER-CFACH3
45664​
LAGER-CFACH4
45665
LAGER-A(NULL)


Dein Edit scheint aber zu funktionieren. Besten Dank schonmal bis dahin. Ich teste das mal ausgiebiger.
 
  • Gefällt mir
Reaktionen: floq0r
Zurück
Oben