sql - 不同条件的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)
解决方案
您可能可以在 中使用两个left join
s 和: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
条件,查询应该快得多。
推荐阅读
- java - 如何让声音在处理中播放一次?
- python - 将列表插入集合后,集合仅包含列表中的项目而不包含列表
- java - 可以将 Spring Boot 配置为检查我的休息控制器中的唯一约束吗?
- regex - 如何将列拆分为具有某些功能的多列?
- html - 如何在CSS中做一个顶部到位置的过渡动画,反之亦然
- python - 如何读取和搜索多个文本文件,以便存储与我的搜索匹配的文件列表?
- mysql - AWS RDS MySQL 连接数
- javascript - 使用拼接删除Javascript中字符串数组的中间字符
- matrix - 如果我知道三个点,如何在 3d 空间中找到平面的角
- javascript - 如果我将套接字连接分配给属性,将事件侦听器应用于该属性,然后分配另一个套接字,侦听器是否仍然有效?