2013-07-17 11 views
5

Ich versuche, linke beitreten in einer Abfrage, aber es scheint, dass ich irgendwo falsch liege.SQL Server links Beitritt

table machines 
-------------- 
machineID 
FaNo 
Barcode 
RoutingCode 
Name 


table log 
------------- 
logID 
lineBarcode 
machineBarcode 

In der Protokolltabelle gibt es Aufzeichnungen auf den Maschinen und den Leitungen. Auf einer Linie können viele verschiedene Maschinen und Maschinen vom gleichen Typ sein.
Der Maschinentyp ist routingCode, also bin ich daran interessiert, alle Maschinen in der Linie auszuwählen und sie zu gruppieren. Nur Maschinen mit unterschiedlichen routingCode sollten separat angezeigt werden, und ich möchte die Anzahl der Maschinen jedes Typs erhalten.
Dies geschieht auf diese Weise.

SELECT routingcode, name, count(1) 
FROM machines 
JOIN log ON log.machinebarcode = machines.barcode 
WHERE log.linebarcode = 100000000001 
GROUP BY routingcode, name 

Okay, alles reibungslos läuft, aber auf diese Weise ich nur Maschinen erhalten, die in log Tabelle beziehen und haben Datensatz nach linebarcode.
Ich dachte, dass, wenn ich LEFT JOIN die Protokolltabelle ich alle Maschinen aus der machines Tabelle bekommen und sie anzeigen und natürlich nur Maschinen, die in log Tabelle gefunden werden count, aber nein.
Wo bin ich falsch und wie finde ich einen geeigneten Workaround?

Antwort

4

Sie müssen die Bedingung auf log in den on Klausel nicht die where setzen. Nicht übereinstimmende Zeilen, die vom linken äußeren Join beibehalten werden, werden für alle Spalten in log mit NULL erweitert.

Zeilen mit NULL für log.linebarcode werden wieder entfernt, wenn sich die Bedingung in der where befindet.

auch statt COUNT(1) Sie müssen eine Spalte aus log zählen, die nicht NULL

SELECT routingcode, 
     name, 
     count(log.linebarcode) 
FROM machines 
     LEFT JOIN log 
     ON log.machinebarcode = machines.barcode 
      AND log.linebarcode = 100000000001 
GROUP BY routingcode, 
      name 
+0

Sie geben wird Dank! Ich wusste nicht, dass ich viele Bedingungen für den Beitritt stellen kann. :) –

-1

es Sie diff nämlich routingcode Maschinennamen und zählen

SELECT distinct name, routingcode, count(1) 
FROM machines 
JOIN log ON log.machinebarcode = machines.barcode 
WHERE log.linebarcode = 100000000001 
GROUP BY routingcode, name 
+0

Abgesehen von der Hinzufügung einer sinnlosen "distinct" und Spaltenumlagerung ist dies das Gleiche wie in der ursprünglichen Frage. –