Sql server 在SQL Server的其他计算字段中使用选择字段
我有一个包含a、B和C列的表,我想从该表中进行选择,但有一些从a、B和C计算的附加字段以及其他计算字段。例如: D=A*B+C E=2*D+4*A F=D*D*E 我想我可以这样解决这个问题: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 +
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:-接受这个答案,因为这是我最终选择的答案。再次感谢!