gpt4 book ai didi

sql-server - 无法绑定(bind)多部分标识符

转载 作者:行者123 更新时间:2023-12-03 11:16:00 26 4
gpt4 key购买 nike

我知道关于 SO 的这个异常(exception)有几个问题,但没有看到对我有帮助的东西。

我有以下查询给我一个 "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) 的所有先前 claim 的 claim 。

我也尝试过的是:
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

更新:解决方案是将 OPTION (MAXRECURSION 0) 添加到 SELECT 语句的末尾。

最佳答案

解决方案是将 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 条记录需要一分钟多的时间),但它可以工作。

更新:以下查询要快得多(<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)

关于sql-server - 无法绑定(bind)多部分标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3986240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com