不同条件的SQL连接

时间:2018-07-03 12:50:59

标签: sql oracle join optimization conditional-statements

我正在编写一个更大的存储过程,其中我必须加入一个包含协议的表。但是,由于我们的结构化数据库是用很少的方式制作的,因此我必须在不同条件下加入协议,以便获得所有行上的正确信息。由于并非所有协议都以rel形式存在,并且并非所有协议都以身份存在,因此并非所有行都可以联接。

如果我将下面的语句分开并加入协议两次,它将起作用。但是然后我有两套agr,这不是最佳选择。以下陈述似乎效率很低。因为正常情况下,整个代码将在5分钟内运行,但是直到50分钟后,此操作才会完成。

因此,有一种更好的方法来进行此连接,在该方法中,我首先在agr1.agreement_id = rel.agreement_id上进行连接,如果返回null(无连接),则其余部分将使用agr1.bill_id = idt.identity。 / p>

  left JOIN agreement agr1
  on(agr1.agreement_id = rel.agreement_id)
  or(agr1.bill_id = idt.identity)

1 个答案:

答案 0 :(得分:4)

您可能可以在left join中使用两个coalesce()select

select . . .,
       coalesce(aa.col1, ab.col1) as col1, 
       . . .
from . . . left join
     agreement aa
     on aa.agreement_id = rel.agreement_id left join
     agreement ab
     on ab.bill_id = idt.identity and aa.agreement_id is null

在没有or条件的情况下,查询应该更快。