parent nodes: SQLapuntes
CondicionesJOIN
05/09/2017
Fuente: Josep Martínez
Problema
He probado con LEFT JOIN y con RIGHT JOIN y no me sale con ninguno
Tengo una tabla de impuestos TaxItemGroupHeading con seis registros.
Luego hay una tabla de artículos InventTableModule con muchos registros.
Quiero sacar un contador del uso de cada tipo de impuestos y no consigo que salga un contador que es cero.
¿Cómo hago para que aparezca una fila con el impuesto de las estanterías y el contador a cero?

Diagnóstico
El fallo está en la parte:
WHERE inv.DATAAREAID = 'COL'
Sabemos que el impuesto de estanterías no tiene artículos en la tabla de inventario, por eso nunca se cumplirá que el campo sea 'COL' cuando no hay registro.
Solución
Las condiciones de la parte WHERE se han de cumplir siempre.
Las condiciones de la parte LEFT JOIN ... ON... se ignoran si no existe el registro en la tabla
Mal: Condición en el WHERE
-- Las condiciones del WHERE se han de cumplir siempre.
-- Como la tabla INV no tiene registros con el impuesto NOR_EST, no cumple el WHERE y no lo incluye en el resultado.
-- Resultado 5 registros, NO incluye NOR_EST pues no cumple el WHERE
SELECT tax.TAXITEMGROUP, tax.NAME, COUNT(inv.RECID) AS CONTADOR,
CASE inv.MODULETYPE WHEN 0 THEN 'Inventario' WHEN 1 THEN 'Compras' WHEN 2 THEN 'Ventas' ELSE '***' END AS Tipo
FROM TaxItemGroupHeading tax
lefT JOIN InventTableModule inv
ON tax.TAXITEMGROUP = inv.TAXITEMGROUPID
AND tax.DATAAREAID = inv.DATAAREAID
WHERE inv.DATAAREAID = 'COL'
GROUP BY tax.TAXITEMGROUP, tax.NAME, inv.MODULETYPE
Bien: Condición en el JOIN
-- Las condiciones del LEFT JOIN no se han de cumplir si la tabla de la izquierda no tiene registros
-- Resultado: 6 registros, incluyendo NOR_EST con contador cero
SELECT tax.TAXITEMGROUP, tax.NAME, COUNT(inv.RECID) AS CONTADOR,
CASE inv.MODULETYPE WHEN 0 THEN 'Inventario' WHEN 1 THEN 'Compras' WHEN 2 THEN 'Ventas' ELSE '***' END AS Tipo
FROM TaxItemGroupHeading tax
lefT JOIN InventTableModule inv
ON tax.TAXITEMGROUP = inv.TAXITEMGROUPID
AND tax.DATAAREAID = inv.DATAAREAID
AND inv.DATAAREAID = 'COL'
GROUP BY tax.TAXITEMGROUP, tax.NAME, inv.MODULETYPE
[camelCaseWordsEnabled: false]