将函数返回到同一行中的另一个函数

时间:2012-11-09 11:11:40

标签: sql sql-server function alias

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

我想要的是:

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

任何解决方法?谢谢!

修改

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

3 个答案:

答案 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