oracle - 三个 select 语句上的 sql 完全外连接
我想从三个表中选择值。每个表都有一个 buyer_entity_id 列。
我已经想出了在两个表上进行外连接的语法,但如何添加第三个表却让我困惑。
以下是两个表联接的语句,它完全按照我希望的方式工作:
select * from (select b.buyer_entity_id, count(distinct(a.row_id)) as imps
from imps a, anl_line b
where b.line_item_id=a.buyer_line_id
and a.entity_id=3
group by b.buyer_entity_id
order by b.buyer_entity_id) tab1
full outer join (select b.buyer_entity_id, count(distinct(a.row_id)) as clicks
from clicks a, anl_line b
where a.buyer_line_id=b.line_item_id
and a.entity_id=3
group by b.buyer_entity_id
order by b.buyer_entity_id) tab2
on tab1.buyer_entity_id = tab2.buyer_entity_id;
第三个表将具有相同的 select 语句,并且也将联接到 Buyer_entity_id 值。但是,当我添加第三个选择语句时,我收到“缺少关键字”错误。下面是我的三路完整外连接语句:
select * from ((select b.buyer_entity_id, count(distinct(a.row_id)) as imps
from imps_table a, line_table b
where b.line_item_id=a.buyer_line_id
and a.entity_id=3
group by b.buyer_entity_id
order by b.buyer_entity_id) tab1
full outer join (select b.buyer_entity_id, count(distinct(a.row_id)) as clicks
from clicks_table a, line_table b
where a.buyer_line_id=b.line_item_id
and a.entity_id=3
group by b.buyer_entity_id
order by b.buyer_entity_id) tab2)
outer join (select b.buyer_entity_id, count(distinct(a.row_id)) as vers
from vers_table a, line_table b
where b.line_item_id=a.buyer_line_id
and a.entity_id=3
group by b.buyer_entity_id
order by b.buyer_entity_id) tab3
on tab1.buyer_entity_id = tab2.buyer_entity_id and tab2.buyer_entity_id=tab3.buyer_entity_id;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
错误如下:
order by b.buyer_entity_id) tab2)
。您需要一个on
子句来指定 tab1 和 tab1 之间的连接条件。选项卡2。order by b.buyer_entity) tab1 on
修复后。您需要将
full
添加到下一行,以便outer join (select b.buyer_entity_id, count(distinct(a.row_id)) as vers
变为full外连接 (select b.buyer_entity_id, count(distinct(a.row_id)) as vers
。这涵盖了语法问题,但不包括语义问题。
连接是成对的,表 1 是在某些条件下连接到表 2,然后结果将成为下一个连接的左侧,如果 tab1 和 tab3 匹配,但 tab2 不匹配,您希望发生什么? tab3 数据和 tab2 空值。
另外,请丢失子查询中的
order by
它们不会为您做任何事情,因为不能保证顺序在连接中存在。The error is here:
order by b.buyer_entity_id) tab2)
. You need anon
clause to specify the join condition between tab1 & tab2.order by b.buyer_entity) tab1 on <join condition)
Once that is fixed. You will need to add
full
to the next line so thatouter join (select b.buyer_entity_id, count(distinct(a.row_id)) as vers
becomesfull outer join (select b.buyer_entity_id, count(distinct(a.row_id)) as vers
.That covers syntax issues, but not semantic issues.
Joins are pair wise table 1 is joined to table 2 on some condition, then the results of that becomes the left side to the next join. What do you want to have happen if tab1 and tab3 match, but tab2 does not? I'd guess produce a row with tab1 and tab3 data and tab2 nulls. Something like:
Also, please lose the
order by
in the subqueries. They are not doing anything for you, since the order is not guaranteed to survive the joins.您可以使用WITH子句来简化一点:
使用first_part as
( ( 选择 .... ) 外连接 ( 选择 .... ));
从first_part 外连接中选择* ( select .... );
不过,您可能想重新审视整体逻辑,看看是否有更好的方法来完成您想要做的事情。多个外连接通常不是最有效的解决方案。
You can simplify a bit using the WITH clause:
With first_part as
( ( select .... ) outer join ( select .... ));
select * from first_part outer join ( select .... );
You may want to revisit the overall logic though and see if there's a better way to accomplish what you're trying to do. Multiple outer joins aren't often the most efficient solution.
更快的方法如下所述
https://forums.oracle.com/thread/2388229
A faster method would be as stated here
https://forums.oracle.com/thread/2388229