不同条件的SQL连接

不同条件的SQL连接,sql,oracle,join,optimization,conditional-statements,Sql,Oracle,Join,Optimization,Conditional Statements,我正在编写一个更大的存储过程,我必须在其中加入一个包含协议的表。然而,因为我们的结构化数据库是以一种罕见的特殊方式创建的,所以我必须在不同的条件下加入协议,以便获得所有行的正确信息。因为不是所有协议都存在于rel中,也不是所有协议都存在于identity中,所以并不是所有行都被加入 如果我将下面的语句拆分并加入两次协议,它就会起作用。然而,我有两套agr,这不是最优的。下面的陈述似乎效率很低。因为正常情况下,整个代码将在5分钟内运行,但这永远不会完成,不会在50分钟后完成 那么有没有更好的方法来

我正在编写一个更大的存储过程,我必须在其中加入一个包含协议的表。然而,因为我们的结构化数据库是以一种罕见的特殊方式创建的,所以我必须在不同的条件下加入协议,以便获得所有行的正确信息。因为不是所有协议都存在于rel中,也不是所有协议都存在于identity中,所以并不是所有行都被加入

如果我将下面的语句拆分并加入两次协议,它就会起作用。然而,我有两套agr,这不是最优的。下面的陈述似乎效率很低。因为正常情况下,整个代码将在5分钟内运行,但这永远不会完成,不会在50分钟后完成

那么有没有更好的方法来进行这种连接呢?我首先在agr1.agreement\u id=rel.agreement\u id上进行连接,如果返回null(无连接),那么我在其余部分使用agr1.bill\u id=idt.identity

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

您可能可以在
选择中使用两个
左连接
合并()

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

如果没有
条件,查询速度应该会快得多。

您可能可以在
选择中使用两个
左连接和
合并()

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

如果没有
条件,查询速度应该更快。

请使用正确的别名,例如“aa.agreement\u id”而不是“a.agreement\u id”和“aa.agreement\u id不为null”而不是“a.agreement\u id不为null”?谢谢。@Flavian CalinicStuparu。修正了。尝试了这个方法,它成功了。代码只需几分钟即可运行:)Thx您是否可以使用正确的别名,例如“aa.agreement\u id”而不是“a.agreement\u id”和“aa.agreement\u id not null”而不是“a.agreement\u id not null”?谢谢。@Flavian CalinicStuparu。修正了。尝试了这个方法,它成功了。代码只需几分钟即可运行:)thx