右外连接与OR条件

时间:2016-09-20 16:29:03

标签: sql oracle oracle11g oracle10g

我有以下查询 -

select *  
from  g 
right outer JOIN  p
ON
( g.c1  = p.c1
or g.c2=p.c2
or g.c3=p.c3
)

ON子句中的OR条件导致严重的性能问题。

我尝试用UNION作为 -

select g.*,p.option_code  
from  g 
right outer JOIN p
ON (g.c1= p.c1)

UNION

select g.*,p.option_code  
from  g 
right outer JOIN p
ON (g.c2=p.c2)

UNION

select g.*,p.option_code  
from  g 
right outer JOIN p
ON (g.c3=p.c3)

是否有可能以另一种方式实现这种联接。

最好的问候

2 个答案:

答案 0 :(得分:0)

首先,right outer join很难从逻辑上理解。所以,让我们用left join

替换它
select *  
from p left join
     g 
     on g.c1  = p.c1 or g.c2=p.c2 or g.c3 = p.c3;

假设您想要匹配的第一个值,您可以执行以下操作:

select p.*, coalesce(g1.col, g2.col, g3.col)
from p left join
     g g1
     on g1.c1 = p.c1 left join
     g g2
     on g2.c2 = p.c2 left join
     g g3
     on g3.c3 = p.c3;

您可以根据需要添加任意数量的coalesce()个表达式。

这与您的查询不是100%相同,但它适用于许多类似的情况。

答案 1 :(得分:0)

select distinct *
from 
(
select g.*,p.option_code  
from  g 
right outer JOIN p
ON (g.c1= p.c1)
UNION all 
select g.*,p.option_code  
from  g 
right outer JOIN p
ON (g.c2=p.c2)
UNION all
select g.*,p.option_code  
from  g 
right outer JOIN p
ON (g.c3=p.c3)
) x