SQL Server 使用 'Or' 运算符进行左连接

标签 sql sql-server tsql left-join

我有四个表,TopLevelParent,两个中级表 MidParentA 和 MidParentB,以及一个可以具有 MidParentA 或 MidParentB 父级的子表(其中一个或另一个 midParent 必须就位)。两个中级表都有一个父表 TopLevelParent。

顶级表如下所示:

TopLevelId | Name
--------------------------
1          | name1   
2          | name2   

MidParent 表如下所示:

MidParentAId | TopLevelParentId |           MidParentBId | TopLevelParentId |
------------------------------------       ------------------------------------
1            |        1         |           1            |        1         |
2            |        1         |           2            |        1         |

子表如下所示:

ChildId | MidParentAId | MidParentBId
--------------------------------
1       |     1        |   NULL
2       |    NULL      |     2

我在一个较大的存储过程中使用了以下左连接,该存储过程超时了,看起来最后一个左连接上的 OR 运算符是罪魁祸首:

SELECT *    
FROM TopLevelParent tlp
LEFT JOIN MidParentA a ON tlp.TopLevelPatientId = a.TopLevelPatientId
LEFT JOIN MidParentB a ON tlp.TopLevelPatientId = b.TopLevelPatientId
LEFT JOIN Child c ON c.ParentAId = a.ParentAId OR c.ParentBId = b.ParentBId

是否有更高效的方法来执行此连接?

最佳答案

考虑到暴露的查询很少;一个非常粗略的经验法则是用 Union 替换 Or 以避免表扫描。

Select..
LEFT JOIN Child c ON c.ParentAId = a.ParentAId 
union
Select..
left Join Child c ON c.ParentBId = b.ParentBId

关于SQL Server 使用 'Or' 运算符进行左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19725014/

相关文章:

sql - 检查 SELECT 中子查询的结果是否存在

sql - 将 OUTPUT 与连接表一起使用

java - "=?"在 SQL 查询中使用时代表什么

mysql - 查询形成

mysql - group by 和 order by count desc 花费时间

sql-server - SQL Server 代理表

javascript - 带有 Sequelize 的 Node.js 上的 SQL Server 2008

tsql - T-SQL RAISERROR WITH NOWAIT 只打印一个字符而不是整个字符串

sql-server - 将可为空的列包装在 ISNULL 中是否会导致表扫描?

mysql - 合并使用困惑