我需要传递在前一列中选择的函数的返回值,并将其作为参数传递给同一行中的后续函数。我不能使用别名:
我想要的是:
SELECT
dbo.GetSecondID(f.ID) as SecondID,
dbo.GetThirdID(SecondID) as ThirdID
FROM Foo f
任何解决方法?谢谢!
编辑:
该方法dbo.GetSecondID()
非常繁重,我正在处理表中的几百万条记录。将方法作为参数传递是不明智的。
我需要传递在前一列中选择的函数的返回值,并将其作为参数传递给同一行中的后续函数。我不能使用别名:
我想要的是:
SELECT
dbo.GetSecondID(f.ID) as SecondID,
dbo.GetThirdID(SecondID) as ThirdID
FROM Foo f
任何解决方法?谢谢!
编辑:
该方法dbo.GetSecondID()
非常繁重,我正在处理表中的几百万条记录。将方法作为参数传递是不明智的。
SQL 的设计方式旨在使所有列都可以并行计算(理论上)。这意味着您不能让一列的值取决于计算不同列的结果(在同一SELECT
子句中)。
为了能够引用该列,您可以引入一个子查询:
SELECT SecondID,dbo.GetThirdID(SecondID) as ThirdID
FROM
(
SELECT
dbo.GetSecondID(f.ID) as SecondID
FROM Foo f
) t
或 CTE:
;WITH Results1 AS (
SELECT
dbo.GetSecondID(f.ID) as SecondID
FROM Foo f
)
SELECT SecondID,dbo.GetThirdID(SecondID) as ThirdID
FROM Results1
如果您要多次建立计算(例如 A 取决于 B,B 取决于 C,C 取决于 D...),那么 CTE 表格通常最终看起来更整洁(IMO)。
答对了!应用CROSS APPLY
. 以下代码很有帮助
SELECT
sndID.SecondID,
dbo.GetThirdID(sndID.SecondID) as ThirdID
FROM Foo f
CROSS APPLY
(
SELECT dbo.GetSecondID(f.ID) as SecondID
) sndID
编辑:
这仅在SecondID
唯一(仅返回一条记录)或GROUP BY
使用时才有效
你是不是这个意思:
SELECT
dbo.GetThirdID(dbo.GetSecondID(f.ID)) as ThirdID
FROM Foo f