如何加入需要来自另一个连接表的参数的函数?

时间:2014-01-13 18:07:51

标签: sql function tsql join

当我尝试以下内容时:

SELECT    *

FROM      Abc
JOIN      Def ON Abc.Id = Def.Id
JOIN      Ghi ON Def.Id = Ghi.Id
LEFT JOIN (
              SELECT Result = dbo.SomeBooleanFunction(Abc.Id)
          ) 
          Func ON Func.Result = 1

我收到错误消息:多部分标识符“Abc.Id”无法绑定

当函数需要来自其外部的连接的参数时,连接函数结果的适当方法是什么?

2 个答案:

答案 0 :(得分:2)

听起来你真的想要这个。

SELECT *
FROM (
    SELECT *
           , dbo.SomeBooleanFunction(Abc.Id) [Result]
    FROM      Abc
    JOIN      Def ON Abc.Id = Def.Id
    JOIN      Ghi ON Def.Id = Ghi.Id
)a
WHERE a.Result=1

OR

    SELECT *
    FROM      Abc
    JOIN      Def ON Abc.Id = Def.Id
    JOIN      Ghi ON Def.Id = Ghi.Id
    WHERE dbo.SomeBooleanFunction(Abc.Id)=1

答案 1 :(得分:1)

不幸的是,连接源无法引用外部列。我不知道这个的原因。使用OUTER APPLY重新构建查询,就像LEFT JOIN一样,但它可以引用外部列。

OUTER APPLY (
 SELECT * FROM (SELECT Result = dbo.SomeBooleanFunction(Abc.Id)) x
 WHERE Result = 1
) Func

你说:

  

我不可能继续包装我必须过滤的每个功能结果。

你可以这样做:

SELECT *
FROM MyTablesAndJoinsHere
CROSS APPLY (
 SELECT
  Result1 = dbo.MyFunc1(...)
  , Result2 = dbo.MyFunc2(...)
  , Result3 = dbo.MyFunc3(...)
) funcResults

您可以通过这种方式轻松添加其他功能生成的列,并轻松选择和过滤它们。