SQL递归部分和
我有两张桌子: 主表SQL递归部分和,sql,sql-server,sqlite,Sql,Sql Server,Sqlite,我有两张桌子: 主表 ... startSubNr endSubNr ... 步骤 ... nrFrom nrTo value ... MasterTable包含例如: startSubNr: 2 endSubNr: 16 nrFrom: 2 nrTo: 19 value: 20 nrFrom: 1 nrTo: 2 value: 10 nrFrom: 19 nrTo: 5 value: 100 nrFrom: 5 nrTo: 16 value: 200 nrFrom: 4 nrTo
...
startSubNr
endSubNr
...
步骤
...
nrFrom
nrTo
value
...
MasterTable包含例如:
startSubNr: 2
endSubNr: 16
nrFrom: 2
nrTo: 19
value: 20
nrFrom: 1
nrTo: 2
value: 10
nrFrom: 19
nrTo: 5
value: 100
nrFrom: 5
nrTo: 16
value: 200
nrFrom: 4
nrTo: 5
value: 50
步骤包括,例如:
startSubNr: 2
endSubNr: 16
nrFrom: 2
nrTo: 19
value: 20
nrFrom: 1
nrTo: 2
value: 10
nrFrom: 19
nrTo: 5
value: 100
nrFrom: 5
nrTo: 16
value: 200
nrFrom: 4
nrTo: 5
value: 50
我需要的是一个sql查询(应该可以在sql Server和sqlite上工作)来计算从startnr到endnr的总和,其中步骤的数量可能会有所不同。步骤(从到)是唯一的
在本例中,必须将20(2-19)、100(19-5)和200(5-16)相加,同时忽略1-2和4-5的值
有没有一种方法可以在sql中实现这一点而不必使用多个查询?我认为这个递归查询可以实现您想要的功能,但有一些限制条件
CREATE TABLE #Steps(nrFrom INT,nrTo INT ,value INT) DECLARE @Start INT = 2,@End INT = 16
INSERT INTO #Steps(nrFrom ,nrTo ,value ) SELECT 2,19,20 UNION ALL SELECT 1,2,10 UNION ALL SELECT 19,5,100 UNION ALL SELECT 5,16,200 UNION ALL SELECT 4,5,50
;WITH _SumCTE (_From , _To , _Value )AS ( SELECT nrFrom ,nrTo,value FROM #Steps WHERE nrFrom = @Start UNION ALL SELECT _To , nrTo , value FROM #Steps JOIN _SumCTE ON _To = nrFrom and nrTo != @End
)
SELECT SUM(_Value) FROM _SumCTE
- 如果无法到达所需的端点(例如@end为1000),它将抛出max递归错误
- 它假定nrFrom是唯一的;如果给定的nrFrom中有多条“路径”,您将得到奇怪的结果
- 循环路径将导致最大递归错误
- sql可能不是执行这种逻辑的地方李>
为什么忽略其他两个值呢?因为在主表中,我有startSubNr=2和endSubNr=16。在步骤表中,我搜索从nrFrom 2开始的步骤(nrTo为19,值为20)。然后我用nrFrom 19搜索一个步骤(nrTo是5,值是100),依此类推。我一直这样做,直到我到达endNr 16的一个步骤,并将所有步骤的值相加。这不会处理终点-如果将UNION all SELECT 16,4500添加到数据中,它将使用max recursioncheck进行爆炸,因为末端确实缺失。否则就可以了。非常感谢。是否需要该级别?您只需要端点的值。