我需要传递在前一列中选择的函数的返回值,并将其作为参数传递给同一行中的以下函数。我不能使用别名:
我想要的是:
SELECT
dbo.GetSecondID(f.ID) as SecondID,
dbo.GetThirdID(SecondID) as ThirdID
FROM Foo f
任何解决方法?谢谢!
修改
方法dbo.GetSecondID()
非常繁重,我正在处理表中的几百万条记录。将该方法作为参数传递是不明智的。
答案 0 :(得分:3)
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)。
答案 1 :(得分:1)
宾果!应用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
时才有效
答案 2 :(得分:0)
你的意思是:
SELECT
dbo.GetThirdID(dbo.GetSecondID(f.ID)) as ThirdID
FROM Foo f