首页 > 解决方案 > 如何重构在 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)

有人可以指导我如何消除此子查询并将其替换为主查询上的连接吗?

例子将不胜感激!

请让我知道你的想法,

谢谢!

标签: sqlsql-server

解决方案


首先,从性能的角度来看,重构不是必需的。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没有任何值。其次,这些具有价值。第二种行为通常是您想要的,但在某些情况下您可能需要第一种行为。


推荐阅读