如何避免在同一个选择中多次重复计算表达式?
Posted
技术标签:
【中文标题】如何避免在同一个选择中多次重复计算表达式?【英文标题】:How can I avoid repeating a calculated expression multiple times in the same select? 【发布时间】:2011-11-18 11:49:45 【问题描述】:如何在同一个选择中多次使用计算列而不重复表达式并且不使用公用表表达式或复杂的子选择?
DECLARE @T TABLE ( NUM1 INT,NUM2 INT)
INSERT INTO @T VALUES (2,3);
INSERT INTO @T VALUES (5,7);
INSERT INTO @T VALUES(32,3);
INSERT INTO @T VALUES(6,8);
SELECT (NUM1+NUM2) [ADD], [ADD]*2, [ADD]/2,* FROM @T
有没有办法在 SQL Server 2005 中解决这个问题?
【问题讨论】:
向表中添加 COMPUTED 列或表视图是一种选择吗? 【参考方案1】:你可以使用交叉应用
SELECT T2.[ADD],
T2.[ADD]*2,
T2.[ADD]/2
FROM @T AS T1
CROSS APPLY (SELECT T1.NUM1+T1.NUM2) AS T2([ADD])
或 CTE
WITH C AS
(
SELECT NUM1+NUM2 AS [ADD]
FROM @T
)
SELECT [ADD],
[ADD]*2,
[ADD]/2
FROM C
或子查询(也称为派生表)
SELECT T.[ADD],
T.[ADD]*2,
T.[ADD]/2
FROM (
SELECT NUM1+NUM2 AS [ADD]
FROM @T
) AS T
不能在声明的同一字段列表中使用列别名。
【讨论】:
交叉应用方法太棒了!!!!但是有一个问题 - 使用资源有效吗?口译员处理得好吗? @GeorgiG 如果您想确定,您应该查看查询计划以了解它是如何执行的。在这个简单的例子中,cross apply
被扩展为在一个计算标量运算符中计算三个不同的值,这与其他两个版本完全相同,并且就像您在列列表中复制了代码一样。因此,在这种情况下,交叉应用只是语法糖,可以减少您键入的内容,并使代码更易于理解和维护。
非常感谢。我看到它创建了一个计算标量,但未能检查原始版本是否相同。无论如何,很棒的信息!谢谢。【参考方案2】:
您可以使用派生表来完成此操作:
SELECT
*,
[ADD]*2,
[ADD]/2
FROM
(
SELECT (NUM1+NUM2) AS [ADD], NUM1, NUM2 FROM @T
) AS A
【讨论】:
以上是关于如何避免在同一个选择中多次重复计算表达式?的主要内容,如果未能解决你的问题,请参考以下文章