使用公用表表达式进行简单选择

时间:2011-06-08 22:38:01

标签: sql sql-server sql-server-2005 tsql common-table-expression

我在项目中注意到以下使用公用表表达式从视图中执行简单的选择:

WITH CTE_View_Alias AS
(
  SELECT 
    Id,
    Column1,
    Column2
  FROM VW_View
),
CTE_Foo AS
(
  SELECT
    B.Bar_Id,
    V.Column1
  FROM VW_Bar B
  INNER JOIN CTE_View_Alias V
    ON B.View_Id = V.Id
)

CTE仅用于另一个地方,另一个CTE。 CTE中的列是视图列的子集。

使用它有什么好处?为什么不直接引用视图?不幸的是,这些sql语句的发起者不再与该公司合作。对我来说,这会降低可读性,但如果我缺乏经验阻止我看到它,我不想消除它。

1 个答案:

答案 0 :(得分:2)

之间没有区别:

WITH CTE_View_Alias AS (
 SELECT v.id,
        v.column1,
        v.column2
   FROM VW_View v)
SELECT t.*
  FROM CTE_View_Alias t

...和

SELECT v.id,
       v.column1,
       v.column2
  FROM VW_View v

这种观点也不合适,但这不是提出的问题......

前面提到的选项与派生表之间没有性能差异:

 SELECT x.*
   FROM (SELECT v.id,
                v.column1,
                v.column2
           FROM VW_View v) x

CTE是派生表的语法糖, 如果不使用递归功能

结论

您必须询问作者为何选择使用CTE。可能有更复杂的操作被删除& CTE因为害怕破坏不可预见的事情而一如既往地离开了。或者它只是他们想要使用的功能......

我一直担心像这样的问题过于抽象/简化以表明决定。