如何连接两个表函数

时间:2016-02-25 20:37:32

标签: sql-server

你必须要表函数。 一个是

select * from [dbo].[GetMembersofGroupPolicy](21929,getdate())

此函数返回一个表,其中一列名为EntityID。 我需要的是执行我的第二个表函数

select * from  dbo.GetFamilyMembers(EntityID) 

对于每个EntityID,我将得到第一个表的结果。 我试过的是

    SELECT F.ParentID, F.Relation, GM.ID_SYMBOLAIOY, GM.TIN, 
    GM.[LastName Native], 
    GM.[FirstName Native], 
    GM.[LastName Eng], 
    GM.[FirstName Eng], 
    GM.DOB, 
    GM.EntryDate, 
    GM.EntityID, 
    GM.TerminationDate, 
    GM.isActive
    FROM 
    dbo.GetMembersofGroupPolicy(21929, GETDATE()) AS GM 
    LEFT OUTER JOIN
    (SELECT id_ypokat, ParentID, prnt, id_ontot_child, Relation
     FROMdbo.GetFamilyMembers(GM.EntityID) AS GetFamilyMembers_1) AS F 
     ON GM.EntityID = F.id_ontot_child

但是我收到一条错误,即无法绑定entityID。

有人可以帮我编辑此查询吗?

3 个答案:

答案 0 :(得分:0)

您不能将行的值作为派生表的一部分传递。你需要使用APPLY。

SELECT F.ParentID
    , F.Relation
    , GM.ID_SYMBOLAIOY
    , GM.TIN
    , GM. [LastName Native]
    , GM.[FirstName Native]
    , GM.[LastName Eng]
    , GM.[FirstName Eng]
    , GM.DOB
    , GM.EntryDate
    , GM.EntityID
    , GM.TerminationDate
    , GM.isActive
FROM dbo.GetMembersofGroupPolicy(21929, GETDATE()) AS GM 
cross apply dbo.GetFamilyMembers(GM.EntityID) AS F
where GM.EntityID = F.id_ontot_child

Paul White在APPLY上有一篇很棒的2篇系列文章。

http://www.sqlservercentral.com/articles/APPLY/69953/

http://www.sqlservercentral.com/articles/APPLY/69954/

确保您在这里确实拥有内联表值函数。如果存在多个查询,则性能可能会受到严重影响。

答案 1 :(得分:0)

SELECT * 
FROM [dbo].GetMembersofGroupPolicy(21929, GETDATE()) AS GM 

outer apply dbo.GetFamilyMembers(GM.EntityID) as F 

如果要模仿内部联接行为,请使用“交叉应用”。

答案 2 :(得分:0)

看起来你需要SQL中的APPLY和CROSS APPLY函数:

  

APPLY运算符允许您为查询的外表表达式返回的每一行调用表值函数。表值函数用作右输入,外表表达用作左输入。从左输入的每一行评估右输入,并将生成的行组合起来用于最终输出。 APPLY运算符生成的列的列表是左输入中的列集,后跟右输入返回的列列表。

https://technet.microsoft.com/en-us/library/ms175156(v=sql.105).aspx

SELECT F.ParentID, F.Relation, GM.ID_SYMBOLAIOY, GM.TIN, 
GM.[LastName Native], 
GM.[FirstName Native], 
GM.[LastName Eng], 
GM.[FirstName Eng], 
GM.DOB, 
GM.EntryDate, 
GM.EntityID, 
GM.TerminationDate, 
GM.isActive
FROM 
dbo.GetMembersofGroupPolicy(21929, GETDATE()) AS GM 
OUTER APPLY
(SELECT id_ypokat, ParentID, prnt, id_ontot_child, Relation
 FROMdbo.GetFamilyMembers(GM.EntityID)) AS F 

希望这有助于或至少让您走上正确的轨道