我有一个包含A,B和C列的表,我想从该表中进行选择,但是需要从A,B和C以及其他计算字段计算出一些额外的字段。例如:
我以为我可以这样解决:
select A, B, C, (A * B + C) as D, (2 * D + 4 * A) as E, (D * D * E) as F
from Table
但是这会导致错误:SQL Server不允许我在E的表达式中使用D。
我想出了两种解决方法:
(2 * (A * B + C) + 4 * A) as E, ((A * B + C) * (A * B + C) * (2 * (A * B + C) + 4 * A)) as F
使用如下的子查询:
select A, B, C, D, E, (D * D * E) as F
from (
select A, B, C, D, (2 * D + 4 * A) as E
from (
select A, B, C, (A * B + C) as D
) as UpToD
) as UpToE
两种解决方案都不令人满意:在情况1中,查询变得无法长时间,每当我改变计算字段的方式时,所有依赖于它的字段都需要更新。递归。在第2种情况下,情况稍好一些,但为我想要计算的每个新字段创建子查询仍然感觉很尴尬,我需要重复列出所有字段名称。
表达此查询的最佳方式是什么?
提前致谢!
答案 0 :(得分:2)
我建议使用函数
CREATE FUNCTION D
(
@A int,
@B int,
@C int
)
RETURNS int
AS
BEGIN
RETURN @A + @B + @C
END
GO
create table test (A int null, B int null, C int null)
insert into test (A,B,C) values(1,2,3)
select A,B,C,dbo.D(1,2,3) as D from test
答案 1 :(得分:1)
虽然我确信有些人可能会对此不满意,但我会选择2,但是这样重写:
select UpToE.*, (D * D * E) as F
from (
select UpToD.*, (2 * D + 4 * A) as E
from (
select A, B, C, (A * B + C) as D
) as UpToD
) as UpToE
它有点清洁,因为你不是一遍又一遍地重复相同的核心列。我知道有些人不喜欢在select中使用*
,但是由于你是在一个表(最里面的子查询)的实际select中明确定义你的列,所以当底层你不会遇到问题表变化。
我不确定这是否会对性能产生任何影响。