3

我知道围绕此例外的问题有几个问题,但没有任何可以帮助我的问题。无法绑定多部分标识符

我有以下查询给了我一个"Multi-part identifier 'claim.fiData' could not be bound" -Exception:

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 IN(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" -Exception。

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

谢谢

编辑:another question这是对主要问题减少。当我在那里得到答案时,我可以删除它。

更新: Marc根据这个here回答了一个简化的问题。 所以要走的路是Cross Apply。 但是,现在我有下面的问题,我已经在上面提到了。我得到了“最大递归100在语句完成前已耗尽”几秒钟后出现错误。 我不知道在哪里添加OPTION(MAXRECURSION 0),因为如果我尝试将它添加到Inline-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 


UPDATE:将溶液添加OPTION(MAXRECURSION 0)到SELECT语句的末尾。

回答

1

解决方法是将OPTION(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条记录),但它的工作原理。

UPDATE:下面的查询是快得多(< 4秒),并使用而无需EXISTSCROSS 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) 
相关问题