Sql 将函数return传递给同一行中的另一个函数

Sql 将函数return传递给同一行中的另一个函数,sql,sql-server,function,alias,Sql,Sql Server,Function,Alias,我需要传递上一列中选择的函数的返回值,并将其作为参数传递给同一行中的后续函数。我无法使用别名: 我想要的是: SELECT dbo.GetSecondID(f.ID) as SecondID, dbo.GetThirdID(SecondID) as ThirdID FROM Foo f 有解决办法吗?谢谢大家! 编辑: 方法dbo.GetSecondID()非常繁重,我正在处理表中的数百万条记录。将方法作为参数传递是不明智的。您的意思是: SELECT dbo.Get

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

我想要的是:

SELECT
    dbo.GetSecondID(f.ID) as SecondID,
    dbo.GetThirdID(SecondID) as ThirdID
FROM Foo f
有解决办法吗?谢谢大家!

编辑:

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

您的意思是:

SELECT
     dbo.GetThirdID(dbo.GetSecondID(f.ID)) as ThirdID
FROM Foo f
你是说:

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

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

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

答对了!应用
交叉应用
的秘密立场。下面的代码很有帮助

SELECT
    sndID.SecondID,
    dbo.GetThirdID(sndID.SecondID) as ThirdID
FROM Foo f
CROSS APPLY
(
    SELECT dbo.GetSecondID(f.ID) as SecondID
) sndID
编辑:


只有当
SecondID
是唯一的(只返回一条记录)或使用了
groupby
时,这才有效

宾果!应用
交叉应用
的秘密立场。下面的代码很有帮助

SELECT
    sndID.SecondID,
    dbo.GetThirdID(sndID.SecondID) as ThirdID
FROM Foo f
CROSS APPLY
(
    SELECT dbo.GetSecondID(f.ID) as SecondID
) sndID
编辑:


仅当
SecondID
是唯一的(只返回一条记录)或使用了
groupby
时,此功能才起作用

谢谢。由于
Results1
实际上将对所有行执行,因此我必须在查询和子查询中都包含“notall complex”
WHERE
子句<代码>交叉应用实际上将使用相同的过滤器。谢谢你的提示!谢谢你。由于
Results1
实际上将对所有行执行,因此我必须在查询和子查询中都包含“notall complex”
WHERE
子句<代码>交叉应用实际上将使用相同的过滤器。谢谢你的提示!