Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL递归部分和_Sql_Sql Server_Sqlite - Fatal编程技术网

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可能不是执行这种逻辑的地方
创建表#步骤(nrFrom int、nrTo int、value int)


为什么忽略其他两个值呢?因为在主表中,我有startSubNr=2和endSubNr=16。在步骤表中,我搜索从nrFrom 2开始的步骤(nrTo为19,值为20)。然后我用nrFrom 19搜索一个步骤(nrTo是5,值是100),依此类推。我一直这样做,直到我到达endNr 16的一个步骤,并将所有步骤的值相加。这不会处理终点-如果将UNION all SELECT 16,4500添加到数据中,它将使用max recursioncheck进行爆炸,因为末端确实缺失。否则就可以了。非常感谢。是否需要该级别?您只需要端点的值。