2013-07-17 10 views
5

Sto provando a fare il join sinistro in una query, ma sembra che io abbia sbagliato da qualche parte.SQL Server a sinistra che unisce

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


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

Nella tabella di registro sono presenti record sulle macchine e sulle linee. Su una riga ci possono essere molte macchine e macchine diverse dello stesso tipo.
Il tipo di macchina è routingCode, quindi sono interessato a selezionare tutte le macchine nella linea e raggrupparle. Solo le macchine con diverso routingCode dovrebbero essere visualizzate separatamente e voglio ottenere il conteggio delle macchine di ogni tipo.
Questo è fatto in questo modo.

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

Va bene tutto fila liscio, ma in questo modo ottengo solo le macchine che sono connessi nella log tavolo e avere registrare in base al linebarcode.
Ho pensato che se avessi LEFT JOIN la tabella dei log avrò tutte le macchine dalla tabella machines e le visualizzeremo e naturalmente solo le macchine che si trovano nella tabella log avranno il count corretto, ma no.
Dove sto sbagliando e come trovare una soluzione adeguata?

risposta

4

È necessario inserire la condizione su log nella clausola on non su where. Le righe non corrispondenti conservate dal join esterno sinistro verranno estese null per tutte le colonne in log.

Le righe con NULL per log.linebarcode verranno rimosse nuovamente se la condizione è where.

Inoltre, invece di COUNT(1) è necessario contare una colonna da log che non sarà 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

Grazie! Non sapevo di poter mettere molte condizioni sul join. :) –

-1

che ti danno diff nome della macchina cioè routingcode e contare

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

Oltre all'aggiunta di un 'distinto' e di un riarrangiamento della colonna senza senso, questo è lo stesso di quello che è nella domanda originale. –