当我尝试以下内容时:
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”无法绑定。
当函数需要来自其外部的连接的参数时,连接函数结果的适当方法是什么?
答案 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
您可以通过这种方式轻松添加其他功能生成的列,并轻松选择和过滤它们。