sql - 如何重构在 SQL Server 中具有联接的子查询
问题描述
我的任务是从我们的一个存储过程中删除子查询。
有一个特定的子查询,我不知道如何重构和提取,所以我可以消除它。
它以 a 开头,LEFT JOIN
然后在里面,还有另一个JOIN
选择一些记录。
这是精简的代码,我不确定您是否需要完整的代码:
LEFT JOIN (
SELECT
T1.LOGID, T2.RGROUP
FROM
TABLEONE T1
JOIN
TABLETWO T2 ON T1.RID = T2.ID
AND CAST(T2.VAL AS BIGINT) = CAST(@SOMEVAR AS BIGINT)
) RR ON (RR.LOGID = T3.ID)
有人可以指导我如何消除此子查询并将其替换为主查询上的连接吗?
例子将不胜感激!
请让我知道你的想法,
谢谢!
解决方案
首先,从性能的角度来看,重构不是必需的。SQL Server 足够聪明,可以重组连接以获得最佳计划。
其次,您可以将其表述为:
T3 LEFT JOIN
(T1 JOIN
T2
ON T1.RID = T2.ID and
CAST(T2.VAL as bigint) = CAST(@SOMEVAR as bigint)
)
ON T1.LOGID = T3.ID
括号很重要。在实践中,您通常可以将其替换为:
T3 LEFT JOIN
T1 JOIN
ON T1.LOGID = T3.ID
T2
ON T1.RID = T2.ID and
CAST(T2.VAL as bigint) = CAST(@SOMEVAR as bigint)
但两者之间存在细微差别。首先,T1
可能匹配T3
但不匹配T2
。在这种情况下,中的列T1
将没有任何值。其次,这些将具有价值。第二种行为通常是您想要的,但在某些情况下您可能需要第一种行为。
推荐阅读
- r - 将值放入子列表
- javascript - × TypeError: Cannot read properties of undefined (reading 'form')
- powershell - 如何避免'ConvertFrom-Csv | ConvertTo-Json' 创建一个数组(方括号)
- php - 在 PHP 中连接两个值
- apache-kafka-streams - KafkaConnect - JdbcSinkConnector - 映射字段列
- html - 如何在vue中使组件高度相同
- java - 如何关联两个不相关的类,以便它们可以在抽象类中用于相同的方法
- reactjs - 如何解决问题 Module not found: Can't resolve 'firebase/storage' in next.js (已经完成 yarn add firebase)
- json - 如何将具有嵌套结构的 Gatling jsonFeeder 转换为 json 请求正文?
- lua - 插入表 LUA 的不同方法