我有四个表,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/