SQL连接顺序和条件

时间:2014-09-18 08:35:08

标签: sql join where-clause

我想加入3个表并在某些条件下进行过滤。

我第一次写了这个查询:

select * from table1 t1
    left join (select * from table2 where table2.fieldX=...) t2
        on t1.id_12=t2.id_12
        left join table3
            on t2.id_23=t3.id_23
where t1.fieldY=...

然后我想通过重写它来使它看起来更像规范:

select * from table1 t1
    left join table2 t2
        on t1.id_12=t2.id_12
        left join table3
            on t2.id_23=t3.id_23
where table2.fieldX=...
and t1.fieldY=...

但它没有给出相同的结果。 我不明白为什么......

你呢?

提前致谢。

2 个答案:

答案 0 :(得分:0)

您是否在第二个查询中添加了内部选择?

SELECT * 
FROM   table1 t1 
       LEFT JOIN table2 t2
           on t1.id_12=t2.id_12 
       LEFT JOIN table3 
           on t2.id_23=t3.id_23 
WHERE  t1.fieldY=...
       and t2.fieldX=...

答案 1 :(得分:0)

当您将table2.fieldX=...放在where子句中时,您将从table1中删除table2中没有相应行的所有行。实际上,您正在将左连接更改为内连接。

相反,您可以在连接本身中应用table2过滤器:

SELECT
    *
FROM
    Table1 t1
    LEFT JOIN Table2 t2 ON t1.id_12 = t2.id_12 AND t2.fieldX = ...
    LEFT JOIN Table3 t3 ON t2.id_23 = t3.id_23
WHERE
    t1.fieldY = ...
相关问题