代码之家  ›  专栏  ›  技术社区  ›  Tim Schmelter

无法绑定多部分标识符

  •  3
  • Tim Schmelter  · 技术社区  · 15 年前

    我知道关于这个例外有几个问题,所以,但没有看到什么能帮助我。

    我有以下问题要问我 "Multi-part identifier 'claim.fiData' could not be bound" -例外:

    SELECT  claim.idData FROM tabData as claim 
     INNER JOIN dbo._previousClaimsByFiData(claim.fiData) AS prevClaim 
     ON prevClaim.idData=claim.fiData 
    GROUP BY claim.idData
    HAVING(prevClaim.fiMaxActionCode IN (8, 23, 24) and 
    prevClaim.Repair_Completion_Date >= DATEADD(day,-90,prevClaim.Repair_Completion_Date))
    ORDER BY claim.idData
    

    previousClaimsByFiData 是返回所有以前记录的表值函数。你可以找到它 here 如果你感兴趣的话。 现在,我要查找在过去90天内具有以前声明的所有声明,其中maxactioncode位于(8,23,24)。

    我还尝试了以下方法:

    SELECT  count(*) FROM tabData as claim 
    where exists(
     select 1 from dbo._previousClaimsByFiData(claim.fiData)as prevClaim where 
      prevClaim.fiMaxActionCode IN(8, 23, 24)and 
      prevClaim.Repair_Completion_Date >= DATEADD(day,-90,claim.Repair_Completion_Date)
    )
    

    但这给了我一个 "The maximum recursion 100 has been exhausted before statement completion" -例外。

    为什么我会得到这些例外,以及如何避免它们?

    谢谢你

    编辑: 问 another question 在主要问题上有所减少。我可以在那里得到答案后删除这个。

    更新: 马克根据这个回答了一个简单的问题 here . 所以要走的路是 Cross Apply . 但是现在我有了下一个问题,我已经在上面提到过了。我在几秒钟后得到一个“语句完成前最大递归100已经用完”的错误。 我不知道在哪里添加选项(maxrecursion 0),因为如果我尝试将其添加到内联TVF中,会得到一个“不正确的语法”。

    我当前的查询是:

    SELECT  claim.idData FROM tabData  claim 
        CROSS APPLY dbo._previousClaimsByFiData(claim.fiData)AS tvfData 
    GROUP BY claim.idData,claim.Repair_Completion_Date,tvfData.Repair_Completion_Date,tvfData.fiMaxActionCode
    HAVING(tvfData.fiMaxActionCode IN (8, 23, 24) and 
    tvfData.Repair_Completion_Date >= DATEADD(day,-90,claim.Repair_Completion_Date))
    ORDER BY claim.idData
    


    更新:解决方案是将选项(maxrecursion 0)添加到select语句的末尾。
    1 回复  |  直到 15 年前
        1
  •  1
  •   Tim Schmelter    15 年前

    解决方案是将选项(maxRecursion 0)添加到select语句的末尾。 工作查询现在是:

    SELECT claim.idData,claim.Repair_Completion_Date,prevClaim.Repair_Completion_Date,prevClaim.fiMaxActionCode FROM tabData  claim 
        CROSS APPLY dbo._previousClaimsByFiData(claim.fiData)AS prevClaim 
    GROUP BY claim.idData,claim.Repair_Completion_Date,prevClaim.Repair_Completion_Date,prevClaim.fiMaxActionCode
    HAVING(prevClaim.fiMaxActionCode IN (8, 23, 24) and 
    prevClaim.Repair_Completion_Date >= DATEADD(day,-90,claim.Repair_Completion_Date))
    ORDER BY claim.idData
    OPTION (MAXRECURSION 0)
    

    这不是最快的查询(在一个11mio rec表中获取23000条记录需要一分钟多的时间),但它起作用。

    更新:以下查询速度更快(<4秒),并且使用 EXISTS 没有 CROSS APPLY :

      SELECT     idData
        FROM     tabData AS claim
        WHERE    fiProductType=1 and fiClaimStatus IN(1,5,7,8,9) AND EXISTS
             (SELECT idData
              FROM   dbo._previousClaimsByFiData(claim.fiData) AS prevClaim
              WHERE  (fiProductType = 1) AND (fimaxActionCode IN (8, 23, 24)) 
              AND (Repair_Completion_Date >= DATEADD(dd, - 90, DATEADD(dd, DATEDIFF(dd,0, claim.Repair_Completion_Date), 0))) 
              AND (Repair_Completion_Date <= claim.Repair_Completion_Date)) 
      order by claim.idData
      OPTION (MAXRECURSION 0)