我知道有关SO的这个例外有几个问题,但没有看到任何有助于我的事。
我有以下查询给我一个"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
是一个Table-Valued-Function,它返回所有以前的记录。如果您有兴趣,可以找到它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"
- 例外。
为什么我会得到这些例外以及如何避免这些例外?
谢谢
修改 问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
<小时/> 更新:解决方案是将OPTION(MAXRECURSION 0)添加到SELECT语句的末尾。
答案 0 :(得分: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)
这不是最快的查询(在&gt; 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)