【问题标题】:INNER JOIN with Table-Valued Function not working表值函数的 INNER JOIN 不起作用
【发布时间】: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.... 精确查询将有助于找到解决方案。

标签: sql-server function tsql sql-function


【解决方案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 代表“原创海报”。
    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    相关资源
    最近更新 更多