代码之家  ›  专栏  ›  技术社区  ›  Karl

如何避免sql中出现重复的子查询连接?

  •  4
  • Karl  · 技术社区  · 15 年前

    在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
    

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

    谢谢

    卡尔

    4 回复  |  直到 15 年前
        1
  •  7
  •   KM.    15 年前

    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、insert、update或delete语句或其他子查询中的select查询。子查询可以在任何允许使用表达式的地方使用。见: http://msdn.microsoft.com/en-us/library/aa213252(SQL.80).aspx

        2
  •  0
  •   Jhonny D. Cano -Leftware-    15 年前

    您可以使用视图。

    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
  •  0
  •   David Hedlund    15 年前

    为什么它们是子查询?

    SELECT T1.stuff, T2.morestuff
    FROM Table T1
    INNER JOIN Table T2
    ON T1.code = T2.code and T1.date1 = T2.date2
    
        4
  •  0
  •   Mark    15 年前

    为什么不在表上加两次别名呢?

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