在T-SQL中,可以在查询中重用表达式而无需重新计算表达式吗?

时间:2014-11-10 22:33:55

标签: sql sql-server performance tsql

例如,我想这样做:

SELECT (A AND (B OR C)) AS ExpressionOne,
       NOT (A AND (B OR C)) AS NotExpressionOne
FROM SomeTable

其中A,B和C可以是任何表达。

SQL Server中是否有一些机制可以在不对SELECT的每一行计算多次(A AND(B OR C))的情况下执行此操作?

问题SQL Server re-calculate or not?指出将重新计算该值,并提供一种可能的解决方案(子查询),但不提及这是否是唯一可行的解​​决方案。

2 个答案:

答案 0 :(得分:1)

我更喜欢common-table-expressions,因为它们易于阅读和维护。

WITH CTE AS
(
    SELECT (A AND (B OR C)) AS ExpressionOne,
       NOT (A AND (B OR C)) AS NotExpressionOne,
       OtherColumns
    FROM SomeTable
)
SELECT ExpressionOne, NotExpressionOne, ...
FROM CTE

您还可以使用sub-query

答案 1 :(得分:1)

我认为你可以使用这样的公用表表达式(CTE):

WITH (Expression (One, otherColumns) as 
    (SELECT (A AND (B OR C)), othercolumns FROM SomeTable)
SELECT One, NOT One, othercolumns
FROM Expression

但它并不清楚这比SQLServer的优化更有效 - 特别是对于相同列的不同计算,我预计它已经非常有效。特别是,CTE必须在某处保存计算结果,无论是在内存中还是在磁盘上,如果它太大的话。试一试,看两次计算是否更快或创建内存结构但只计算一次是值得的。