2013-07-17 25 views
5

Próbuję połączyć w lewo w jedno zapytanie, ale wydaje mi się, że gdzieś się mylę.Serwer SQL pozostały przyłączaniu się

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


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

W tabeli dziennika znajdują się zapisy na maszynach i liniach. W jednej linii może być wiele różnych maszyn i maszyn tego samego typu.
Typ urządzenia to routingCode, więc jestem zainteresowany wyborem wszystkich maszyn w linii i pogrupowaniem ich. Tylko maszyny o innym numerze routingCode powinny być wyświetlane osobno, a ja chcę uzyskać liczbę maszyn każdego typu.
Dokonuje się tego w ten sposób.

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

Ok wszystko przebiega gładko, ale w ten sposób uzyskać tylko maszyny, które są związane w log tabeli i mają zapis według linebarcode.
Myślałem, że jeśli I LEFT JOIN tabeli dziennika otrzymam wszystkie maszyny z tabeli machines i wyświetlić je i oczywiście tylko maszyny, które znajdują się w tabeli będą miały właściwe count, ale nie.
Gdzie się mylę i jak znaleźć odpowiednie obejście?

Odpowiedz

4

Musisz umieścić warunek na log w klauzuli on, a nie where. Niezgodne wiersze zachowane przez lewe sprzężenie zewnętrzne będą miały wartość zerową dla wszystkich kolumn w log.

Wiersze z NULL dla log.linebarcode zostaną usunięte ponownie, jeśli stan jest w where.

Również zamiast COUNT(1) trzeba liczyć kolumnę z log że nie będzie 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

Dziękujemy! Nie wiedziałem, że mogę postawić wiele warunków na złączeniu. :) –

-1

to daje diff nazwa maszyny mianowicie routingcode i liczyć

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

Oprócz dodania bezsensownej "odrębnej" i rearanżacji kolumn jest to to samo, co w oryginalnym pytaniu. –