Join 尝试从性能良好的表中获取数据

Join 尝试从性能良好的表中获取数据,join,plsql,subquery,Join,Plsql,Subquery,我正在尝试获取客户和所有者数据 客户 |cnumber|id| |080204220 | 32859471000 | |907501981 | 6029151000| 角色 |标识|类型| |32859471000 |所有者| |6029151000 |客户| 结果集 id|编号|所有者编号|类型| |32859471000 | 080204220 | 080204220 |所有者 |6029151000 | 907501981 | 080204220 |客户 查询 select c.id,su

我正在尝试获取客户和所有者数据

客户
|cnumber|id|
|080204220 | 32859471000 |
|907501981 | 6029151000|

角色
|标识|类型|
|32859471000 |所有者|
|6029151000 |客户|

结果集
id|编号|所有者编号|类型|
|32859471000 | 080204220 | 080204220 |所有者
|6029151000 | 907501981 | 080204220 |客户

查询

select c.id,sub.cnumber,c.cnumber, r.roletype
from customer c 
inner join role r on c.id = r.id 
left outer join (select c.cnumber ,r.roletype,c.id
                     from customer c
                     INNER JOIN role r
                     ON c.id = r.id  ) sub on  sub.roletype='owner';

此查询给出了正确的结果,但使用相同表的左外部联接可能会对性能造成影响,是否有其他方法可以实现此目的?

根据我的逻辑,您需要在所有其他表中显示“所有者”-客户

由于示例数据中只有一个所有者,因此我将使用“交叉联接”(笛卡尔联接)来实现


我希望你只带这个

select c.id,sub.cnumber,c.cnumber, r.roletype
from customer c 
inner join role r on c.id = r.id 
left outer join (select c.cnumber ,r.roletype,c.id
                     from customer c
                     INNER JOIN role r
                     ON c.id = r.id  ) sub on  sub.roletype='owner';

是的,但是再次使用相同的表,我的观点是我在子查询中也使用相同的表,所以它会影响性能。所以我想知道还有其他的方法可以实现吗this@Shine,我不这么认为:无论如何,您必须加入两个不同的查询。一个是加入客户和角色,另一个是仅显示所有者客户。如果没有其他方法,我将仅继续查询。谢谢你:-)“可能会对性能造成影响”,实际上做得很好。您运行了多少个测试。在尝试重写之前,我会查看索引。另一个“可能”:第二次连接的一个或两个结果可能已经在缓冲区中,因此防止了另一个物理I/O,从而提高了某些其他查询的性能。这似乎是一个典型的过早优化例子(谷歌:Donald Knuth premature optimization)。
select c.id,sub.cnumber,c.cnumber, r.roletype
from customer c 
inner join role r on c.id = r.id 
left outer join (select c.cnumber ,r.roletype,c.id
                     from customer c
                     INNER JOIN role r
                     ON c.id = r.id  ) sub on  sub.roletype='owner';