left join turns into inner join

后端 未结 8 758
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-29 06:24
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         


        
相关标签:
8条回答
  • 2020-11-29 07:17

    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)..

    0 讨论(0)
  • 2020-11-29 07:19

    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.

    0 讨论(0)
提交回复
热议问题