表值函数的 INNER JOIN 不起作用

Posted

技术标签:

【中文标题】表值函数的 INNER JOIN 不起作用【英文标题】:INNER JOIN with Table-Valued Function not working 【发布时间】:2014-06-17 14:43:39 【问题描述】:

我有一个返回表的表值函数。当我尝试 JOIN 将表值函数与另一个表一起使用时,我没有得到任何结果,但是当我将该函数的结果复制到实际表中并执行相同的连接时,我会得到预期的结果。

查询看起来像这样:

Select *
From myTable
INNER JOIN fn_function(@parm1, @param2)
ON ....

我总共有大约 4 个这样的查询,每个查询的功能都略有不同,但所有功能都生成相同的表但数据不同。对于其中一些查询,INNER JOIN 有效,但对于其他查询则无效。

任何提示为什么会发生这种情况?

【问题讨论】:

可能与不匹配的数据类型有关。你能给我们看一些真实的代码吗? 示例数据和 sql fiddle 会很有用。 给出确切的查询以提供帮助。它应该工作。我通常给函数取一个别名,如INNER JOIN fn_function(@param1, @param2) fn ON.... 精确查询将有助于找到解决方案。 【参考方案1】:

我认为这应该可行

  Select * 
    From Animals 
    Join dbo.AnimalsTypesIds(900343) 
      As AnimalsTypes
      On AnimalsTypes.TypeId = Animals.TypeId

在表值函数中,返回表应该有 TypeId 以便连接适用于该子句

【讨论】:

【参考方案2】:

您的联接的“ON”子句很可能不正确。也许像

这样的小错字

加入 x ON oID = odID

而不是

加入 x ON oID = oID

【讨论】:

我的正确答案。【参考方案3】:

如果我们假设表值函数的参数不动态依赖于 myTable 列,这将起作用。

   SELECT *
    FROM myTable 
    INNER JOIN

    (SELECT * from fn_function(@para1, @para2 etc))
 ON ...

但是如果参数依赖于 myTable 它将不起作用

【讨论】:

这并没有真正回答问题:您只是展示了一种更详细的方式来表达相同的结果,而没有解释如果参数 do 依赖于如何解决问题myTable 的每一行。【参考方案4】:

对于表值函数,您通常使用Cross Apply

Select *
From myTable m
CROSS APPLY fn_function(m.field1, m.field2)

【讨论】:

仅当您想将外部查询中的某些内容作为参数传递给函数时。 OP 的情况并非如此。 但是这个函数需要参数。那么我应该用连接列替换参数吗? 是的,如果它们是相同的列。 @AnupAgrawal - 根据我的经验,OP 可用于两个密切相关的术语 - 原始帖子(提出的问题)或原始海报(提出问题的人)。通常,您可以根据上下文推断出是哪一个意思,或者甚至可能无关紧要。 @AnupAgrawal 交叉应用一个函数将导致它对外部选择中的每一行执行一次,而不是加入它,它只执行一次。你不能只是切换两者。 OP 代表“原创海报”。

以上是关于表值函数的 INNER JOIN 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

INNER JOIN 更新不起作用

为啥这个使用 INNER JOIN 的 SQL DELETE 查询不起作用? [复制]

ORACLE SQL UPDATE 与 INNER JOIN 不起作用

带有 WHERE 子句和 INNER JOIN 的 MySQL 更新查询不起作用

将DataTable传递给存储过程中的表值参数不起作用[关闭]

加入()函数加载页面在移动设备上不起作用