Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server的其他计算字段中使用选择字段_Sql Server_Select - Fatal编程技术网

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

Sql server 在SQL Server的其他计算字段中使用选择字段,sql-server,select,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 select UpToE.*, (D * D * E) as F from ( select UpToD.*, (2 * D +

我有一个包含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
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
但这会导致一个错误:SQLServer不允许我在E的表达式中使用D

我想出了两种方法来解决这个问题:

我将D在E和F中的用法以及D和E在F中的用法扩展到它们的完整定义,例如2*A*B+C+4*A作为E,A*B+C*A*B+C*2*A*B+C+4*A作为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中,情况稍微好一点,但是为我要计算的每个新字段创建一个子查询仍然感觉很尴尬,我需要重复列出所有字段名

表达这个问题的最佳方式是什么


提前谢谢

虽然我相信有些人可能会不赞成,但我还是选择了选项2,但改写如下:

select A, B, C, (A * B + C) as D, (2 * D + 4 * A) as E, (D * D * E) as F
from Table
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 from表(最内部的子查询)中显式定义列,因此当基础表发生更改时,您不会遇到问题


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

虽然我肯定有些人可能会不赞成,但我还是选择了选项2,但改写如下:

select A, B, C, (A * B + C) as D, (2 * D + 4 * A) as E, (D * D * E) as F
from Table
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 from表(最内部的子查询)中显式定义列,因此当基础表发生更改时,您不会遇到问题


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

我建议使用函数

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

我建议使用函数

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

我更喜欢2,你也可以通过明智地使用*避免重复列出字段名,我认为这是可以辩护的我更喜欢2,你也可以通过明智地使用*避免重复列出字段名,我认为这是可以辩护的谢谢。现在我明白了为什么SQL Server的文档需要提到最大子查询深度是32:-接受这个答案,因为这是我最终选择的答案。再次感谢!谢谢现在我明白了为什么SQL Server的文档需要提到最大子查询深度是32:-接受这个答案,因为这是我最终选择的答案。再次感谢!