我在项目中注意到以下使用公用表表达式从视图中执行简单的选择:
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语句的发起者不再与该公司合作。对我来说,这会降低可读性,但如果我缺乏经验阻止我看到它,我不想消除它。
答案 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因为害怕破坏不可预见的事情而一如既往地离开了。或者它只是他们想要使用的功能......
我一直担心像这样的问题过于抽象/简化以表明决定。