【问题标题】:SQL join of different conditions不同条件的SQL join
【发布时间】:2018-12-11 19:10:38
【问题描述】:

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

【问题讨论】:

    标签: sql oracle join optimization conditional-statements


    【解决方案1】:

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

    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 条件,查询应该快得多。

    【讨论】:

    • 能否请您使用正确的别名,例如“aa.agreement_id”而不是“a.agreement_id”和“aa.agreement_id is not null”而不是“a.agreement_id is not null”?谢谢。
    • @Flavian-CalinicStuparu 。 . .固定。
    • 尝试了这种方法,它奏效了。代码只需几分钟即可运行 :) thx
    猜你喜欢
    • 1970-01-01
    • 2012-05-03
    • 2023-03-17
    • 2012-11-13
    • 2016-09-29
    • 1970-01-01
    • 2020-06-15
    • 2016-03-15
    • 2014-01-05
    相关资源
    最近更新 更多