1

我需要传递在前一列中选择的函数的返回值,并将其作为参数传递给同一行中的后续函数。我不能使用别名:

我想要的是:

SELECT
    dbo.GetSecondID(f.ID) as SecondID,
    dbo.GetThirdID(SecondID) as ThirdID
FROM Foo f

任何解决方法?谢谢!

编辑:

该方法dbo.GetSecondID()非常繁重,我正在处理表中的几百万条记录。将方法作为参数传递是不明智的。

4

3 回答 3

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)。

于 2012-11-09T11:36:50.807 回答
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使用时才有效

于 2012-11-09T15:04:09.027 回答
0

你是不是这个意思:

SELECT
     dbo.GetThirdID(dbo.GetSecondID(f.ID)) as ThirdID
FROM Foo f
于 2012-11-09T11:19:06.263 回答