我想加入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=...
但它没有给出相同的结果。 我不明白为什么......
你呢?
提前致谢。
答案 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 = ...