2016-11-22 49 views
1

我有兩個表:SQL遞歸部分和

MasterTable

... 
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 

我需要的是一個SQL查詢(其中應SQL-Server和SQLite的上工作)來計算從startnr總和的endnr,其中的工序數變化。步驟(從 - 到)是獨特的。

在這個例子中,將要總結(2-19),(19-5)和(5-16)而忽略的值1-2和4-5。

有沒有辦法在SQL中做到這一點,而無需使用多個查詢?

+0

爲什麼你忽略其他兩個值..? – Mansoor

+0

因爲在Mastertable中,我有startSubNr = 2和endSubNr = 16。在Steps表中,我搜索以nrFrom 2開始的一個步驟(nrTo爲19,值爲20)。然後我用nrFrom 19搜索一個步驟(nrTo是5,值是100)等等。我這樣做,直到我到達第16步,並總結所有步驟的值。 – Karl

回答

1
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 
+1

這不處理結束點 - 如果您將UNION ALL SELECT 16,4,500添加到您的數據,它會以最大遞歸彈出 –

+0

它工作正常 – Mansoor

+0

檢查結果是否真的缺失。否則,它工作正常。謝謝! – Karl

1

這遞歸查詢你想要做什麼,我認爲,有一些附加條件

  • 它會拋出一個最大遞歸錯誤,如果它不能達到期望的終點(例如,如果@end 1000 )
  • 它假定nrFrom是唯一的;如果有多個「路徑」出給定nrFrom的你會得到奇怪的結果
  • 循環路徑將導致最大遞歸誤差
  • SQL可能不是做這個邏輯的地方!

create table #step(nrFrom int,nrTo int,value int);

insert into #step values(2,19,20); 
insert into #step values(1,2,10); 
insert into #step values(19,5,100); 
insert into #step values(5,16,200); 
insert into #step values(4,5,50); 
insert into #step values(16,4,500); -- add this to check we dont go further once we reach 16 

declare @start int = 2; 
declare @end int = 16; 

with cte(nrTo, val) as 
(
    select nrTo, value 
    from #step 
    where nrFrom = @start 

    union all 

    select #step.nrTo, value 
    from cte 
    inner join #step on #step.nrFrom = cte.nrTo 
    and #step.nrFrom != @end 
) 
select sum(val) 
from cte 
+1

需要的級別是?你只需要終點的價值。 –

+0

你是對的 - 回答相應簡化 –