我有以下查询 -
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)
是否有可能以另一种方式实现这种联接。
最好的问候
答案 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