left join turns into inner join

后端 未结 8 789
爱一瞬间的悲伤
爱一瞬间的悲伤 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 06:56

    The 'where' clause is performed after the join. This doesn't matter for inner joins but matters for outer joins.

    Shorten Example

    SELECT b.bar,c.foobar FROM tableTwo AS b LEFT JOIN tableThree AS c ON b.pk=c.fk WHERE c.foobar='somethingelse'
    
    Raw data                  Outer Join Result        Select Result
    b.pk c.fk c.foorbar       b.pk c.fk c.foorbar      c.foorbar
    1    1    something       1    1    something      
    1    1    somethingelse   1    1    somethingelse  somethingelse
    
    
    SELECT b.bar,c.foobar FROM tableTwo AS b LEFT JOIN tableThree AS c ON b.pk=c.fk AND c.foobar='somethingelse'
    
    Raw data                  Outer Join Result        Select Result
    b.pk c.fk c.foorbar       b.pk c.fk c.foorbar      c.foorbar
    1    1    something       1    null null           null
    1    1    somethingelse   1    1    somethingelse  somethingelse
    

提交回复
热议问题