首页 > 解决方案 > 不同条件的SQL join

问题描述

我正在编写一个更大的存储过程,我必须加入一个包含协议的表。然而,因为我们的结构化数据库是以一种更特殊的方式制作的,所以我必须在不同的条件下加入协议才能获得所有行的正确信息。由于并非所有协议都存在于 rel 中,并且并非所有协议都存在于身份中,因此并非所有行都被加入。

如果我将下面的声明拆分并加入两次协议,它会起作用。但是,我有两组 agr,这不是最佳的。下面的陈述似乎非常低效。因为通常整个代码将在 5 分钟内运行,但这永远不会完成,而不是在 50 分钟之后。

那么有没有更好的方法来进行这种加入,我首先加入 agr1.agreement_id = rel.agreement_id 如果返回 null(无加入),那么我在其余部分使用 agr1.bill_id = idt.identity。

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

标签: sqloraclejoinoptimizationconditional-statements

解决方案


您可能可以在 中使用两个left joins 和: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条件,查询应该快得多。


推荐阅读