【问题标题】:How do I avoid a repetitive subquery JOIN in SQL?如何避免 SQL 中重复的子查询 JOIN?
【发布时间】:2010-03-25 13:44:38
【问题描述】:

在 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

这两个子查询完全相同。有什么方法可以在不重复子查询脚本的情况下做到这一点?

谢谢

卡尔

【问题讨论】:

    标签: sql sql-server-2008 join subquery


    【解决方案1】:

    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
    

    仅供参考

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

    【讨论】:

    • 谢谢。我希望这能提高性能 - 还是只清理代码? “YourQuery”是否只执行一次,还是每次从 YourQuery 调用 SELECT ... 时都会重做计算?
    • 我认为它可以在每次使用时重新评估 CTE,但这是确定的最佳方法:在 SQL Server Management Studio 中,运行此命令:SET SHOWPLAN_ALL ON,然后运行您的原始查询.您的查询不会运行,但会显示执行计划,请查看包含“select”的第一行的TotalSubtreeCost 列。运行查询的 CTE 版本并再次查看 TotalSubtreeCost 列。有很大区别吗?如果不是,那么它可能正在重新评估它。您可以查看实际的计划行并了解 SQL Server 如何将您的查询分解为要处理的步骤。
    【解决方案2】:

    您可以使用视图。

    CREATE VIEW myView AS 
    SELECT code, date1, date2 
    FROM Table
    

    然后您的查询将是这样的:

    SELECT T1.stuff, T2.morestuff 
    FROM myView as T1
    INNER JOIN myView as T2 ON T1.code = T2.code and  T1.date1 = T2.date2
    

    【讨论】:

      【解决方案3】:

      为什么它们是子查询?

      SELECT T1.stuff, T2.morestuff
      FROM Table T1
      INNER JOIN Table T2
      ON T1.code = T2.code and T1.date1 = T2.date2
      

      【讨论】:

      • Why are they subqueries at all? 也许 OP 的实际查询比问题中列出的要复杂得多。
      【解决方案4】:

      为什么不给表加别名两次?

      SELECT T1.stuff, T2.stuff FROM Table as T1 INNER JOIN Table as T2
      ON T1.code = T2.code and  T1.date1 = T2.date2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-28
        • 1970-01-01
        • 2019-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多