如何在SQL中避免重复的子查询JOIN?

Kar*_*arl 4 sql join subquery sql-server-2008

在SQL Server 2008中:

我有一张桌子,我想沿着以下几行做一些事情:

SELECT T1.stuff, T2.morestuff from
(
 SELECT code, date1, date2 from Table
) as T1
INNER JOIN
(
 SELECT code, date1, date2 from Table
) as T2

ON T1.code = T2.code and  T1.date1 = T2.date2
Run Code Online (Sandbox Code Playgroud)

这两个子查询完全相同.有没有办法在不重复子查询脚本的情况下做到这一点?

谢谢

卡尔

KM.*_*KM. 7

CTE:

;WITH YourQuery AS
(
 SELECT code, date1, date2 from Table
)
SELECT 
    T1.stuff, T2.morestuff 
    from YourQuery           T1
        INNER JOIN YourQuery T2 ON T1.code = T2.code and  T1.date1 = T2.date2
Run Code Online (Sandbox Code Playgroud)

FYI

在该问题中,代码使用派生表,也称为内联视图.子查询是一个SELECT查询,它返回单个值并嵌套在SELECT,INSERT,UPDATE或DELETE语句中,或嵌套在另一个子查询中.子查询可以在允许表达式的任何地方使用.请参阅:http://msdn.microsoft.com/en-us/library/aa213252(SQL.80).aspx

  • 我认为它可以在每次使用时重新评估CTE,但这是最好的方法:在SQL Server Management Studio中,运行以下命令:`SET SHOWPLAN_ALL ON`,然后运行原始查询.您的查询将不会运行,但会显示执行计划,查看包含"select"的第一行的`TotalSubtreeCost`列.运行查询的CTE版本,再次查看`TotalSubtreeCost`列.有什么区别吗?如果没有,那么它可能会重新评估它.您可以查看实际的计划行,并查看SQL Server如何将查询分解为要处理的步骤. (2认同)