在SQL Server中的其他计算字段中使用选择字段

时间:2009-12-23 14:52:09

标签: sql-server select

我有一个包含A,B和C列的表,我想从该表中进行选择,但是需要从A,B和C以及其他计算字段计算出一些额外的字段。例如:

  • D = A * B + C
  • E = 2 * D + 4 * A
  • F = D * D * E

我以为我可以这样解决:

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。

我想出了两种解决方法:

  1. 我将E在E和F中的用法以及F中D和E的用法扩展到它们的完整定义,例如: (2 * (A * B + C) + 4 * A) as E, ((A * B + C) * (A * B + C) * (2 * (A * B + C) + 4 * A)) as F
  2. 使用如下的子查询:

    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
    
  3. 两种解决方案都不令人满意:在情况1中,查询变得无法长时间,每当我改变计算字段的方式时,所有依赖于它的字段都需要更新。递归。在第2种情况下,情况稍好一些,但为我想要计算的每个新字段创建子查询仍然感觉很尴尬,我需要重复列出所有字段名称。

    表达此查询的最佳方式是什么?

    提前致谢!

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中明确定义你的列,所以当底层你不会遇到问题表变化。

我不确定这是否会对性能产生任何影响。