表值函数的 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 的 SQL DELETE 查询不起作用? [复制]
ORACLE SQL UPDATE 与 INNER JOIN 不起作用
带有 WHERE 子句和 INNER JOIN 的 MySQL 更新查询不起作用