2016-06-03 26 views
0

Unten ist die Abfrage: Was ich versuche zu tun ist, alle Datensätze von 'Teile' und alle Datensätze von oelineitem, wo parts.id ist gleich owlineitems.part_id als auch ich brauche ein paar Felder vom Tisch 'oe'. Ich bin garantiert eine Zeile in oe für jede Zeile in oelinitems (viele zu einer Beziehung), aber ich bin nicht garantiert eine Zeile in oelineitem für jede Zeile in Teilen. Auch wenn es keine Zeile in oelineitem gibt, muss die Zeile aus den Teilen im Dataset sein.Ich habe Probleme mit meiner SQL-Abfrage in Postgrsql

SELECT parts.partnumber, 
     parts.description, 
     parts.bin, 
     parts.obsolete, 
     orderitems.qty, 
     oe.transdate 
FROM parts 
LEFT JOIN orderitems 
     ON parts.id = orderitems.parts_id 
LEFT JOIN oe 
     ON orderitems.trans_id = oe.id 
WHERE oe.customer_id <> 12228 
ORDER BY part.partnumber; 
+4

Was genau ist Ihre Frage? –

Antwort

2

Verschieben Sie die Kriterien von WO auf ON:

SELECT parts.partnumber, 
     parts.description, 
     parts.bin, 
     parts.obsolete, 
     orderitems.qty, 
     oe.transdate 
FROM parts 
LEFT JOIN orderitems 
     ON parts.id = orderitems.parts_id 
LEFT JOIN oe 
     ON orderitems.trans_id = oe.id 
     AND oe.customer_id <> 12228 
ORDER BY part.partnumber; 

Sie sind Außen-Verbindungsdatensätzen. Wenn es keine Übereinstimmung gibt, schließen Sie sich einem Dummy-Datensatz mit allen Spalten NULL an. Wenn Sie WHERE oe.customer_id <> 12228 fragen, werden diese Datensätze gelöscht, sodass Sie alle extern verknüpften Datensätze entfernen und sich dort befinden, wo Sie nur mit einem inneren Join verbunden wären.

(Weil NULL <> 12228 Ergebnisse in null, nicht in dem Fall.)