我正在编写一个更大的存储过程,其中我必须加入一个包含协议的表。但是,由于我们的结构化数据库是用很少的方式制作的,因此我必须在不同条件下加入协议,以便获得所有行上的正确信息。由于并非所有协议都以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)
答案 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
条件的情况下,查询应该更快。