问题描述
在plpgsql语言中使用left outer join 和 right outer join的格式有一些区别,得到的结果相同。
问题复现
left outer join
select * from(
select * from table_b
where column_b in (select column_a
from table_a) b
left outer join select * from table_c c
on b.column_b = c.column_b;
right outer join
select * from table_c c
right outer join
(select * from table_b
where
and column_b in (select column_a
from table_a) b
on c.column_b = b.column_b;
问题分析
可以看到两种语法虽然得到的结果相同,但是乍一眼一看实现的逻辑是不同的。从表面上看left outer join要比right outer join 外层多执行一次select语句。但实际上两种方式是相同的,这是受格式原因误导了。
right outer join:
表面上很容易被误解为:
select * from table_c;
right outer join
select * from table_b
where
and column_b in (select column_a
from table_a);
但是其实这不是两个select 语句的join,而是表格和语句的join,实际上:
select * from
table_c
right outer join
select * from table_b
where
and column_b in (select column_a
from table_a);
这才是这个语句的正确解读方式,从本质上来说和left outer join就能保持一致了。
总结
在执行多表join时,要特别注意只有select * from table_a
这种无条件、排序等的最基础查询语句,可能执行顺序是先联合再查询。