SELECT
a.foo
b.bar
c.foobar
FROM tableOne AS a
INNER JOIN tableTwo AS b ON a.pk = b.fk
LEFT JOIN tableThree AS c ON b.pk = c.fk
WHERE a.foo = \'something\'
AND c.foo
1st case (where the c.foobar is in the where clause) the filtering by the c.foobar
happens after the joins have occured (they occur correctly), so you effectively filter-out all resulting records that do not have a 'somethingelse'
in there..
2nd case the c.foobar
is part of the join, so it evaluates at joining time and just controls the output of the join, and not the final recordset (returnsnull
where the join fails)..
It's because of your WHERE
clause.
Whenever you specify a value from the right side of a left join in a WHERE
clause (which is NOT NULL
), you necessarily eliminate all of the NULL
values and it essentially becomes an INNER JOIN
.
If you write, AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
that will solve the problem.
You can also move the c.foobar
portion into your join predicate, and that too will solve the issue.