2012-02-23 63 views
0

選擇我有下一個結構的表TSQL遞歸

Id|State|Quan|SellQuan|LastId 
3 |2 | 5 | 0  |2 
2 |3 |10 | 5  |1 
1 |3 |15 | 5  |NULL 

LastId上Id字段引用,我需要下一步驟calulate值:從ID立即泉= 3然後添加與ID的所有sellquan引用上前一個LastId。那就是meer Id = 3 - lastId = 2 =>從Id = 2獲取值字段sellquan然後chek如果lastId不爲null 。在我的例子中LastId = 1 =>取Id = 1值SellQaun 結果:5 + 5+ 5 = 15

+1

什麼是DBMS? – 2012-02-23 17:41:47

+0

sql server 2008R2 – driver 2012-02-23 19:53:05

回答

1

我不是很確定你想要什麼。但我會試一試。

首先是一些測試數據:

DECLARE @tbl TABLE(Id INT,State INT,Quan INT,SellQuan INT,LastId INT) 
INSERT INTO @tbl 
VALUES 
    (3,2,5,0,2), 
    (2,3,10,5,1), 
    (1,3,15,5,NULL) 

然後遞歸函數是這樣的:

DECLARE @Id INT=1 
;WITH CTE(Id,parentId,SellQuan,topParent) 
AS 
(
    SELECT 
     tbl.Id, 
     tbl.LastId AS parentId, 
     (CASE 
      WHEN EXISTS(SELECT NULL FROM @tbl AS tbl2 WHERE tbl2.LastId=tbl.Id) 
      THEN tbl.SellQuan 
      ELSE tbl.Quan 
     END) AS SellQuan, 
     tbl.Id AS topParent 
    FROM 
     @tbl AS tbl 
    WHERE 
     [email protected] 
    UNION ALL 
    SELECT 
     tbl.Id, 
     tbl.LastId AS parentId, 
     (CASE 
      WHEN EXISTS(SELECT NULL FROM @tbl AS tbl2 WHERE tbl2.LastId=tbl.Id) 
      THEN tbl.SellQuan 
      ELSE tbl.Quan 
     END) AS SellQuan, 
     CTE.topParent AS topParent 
    FROM 
     @tbl AS tbl 
     JOIN CTE 
      ON CTE.Id=tbl.LastId 
) 
SELECT 
    CTE.topParent AS id, 
    SUM(CTE.SellQuan) AS SellQaunResult 
FROM 
    CTE 
GROUP BY 
    CTE.topParent 

希望這有助於

0

基於你問什麼,我認爲你有一個在您的示例表中輸入錯字。如果您對以下內容進行了更改,它將更改CTE的複雜性:

Id|State|Quan|SellQuan|LastId 
3 |2 | 5 | 5  |2 
2 |3 |10 | 5  |1 
1 |3 |15 | 5  |NULL 

我做了這樣的改變,它簡化了CTE。

DECLARE @tbl TABLE(Id INT,State INT,Quan INT,SellQuan INT,LastId INT) 
INSERT INTO @tbl 
VALUES 
(3,2,5,5,2), 
(2,3,10,5,1), 
(1,3,15,5,NULL); 

;WITH CTE(Id,total,depth) 
AS (
SELECT tbl.Id, SellQuan as total, 0 as depth 
    FROM @tbl AS tbl 
WHERE tbl.LastId is null 
UNION ALL -- Recursive part of the query 
SELECT tbl.Id, 
     tbl.SellQuan + CTE.total, 
     CTE.depth + 1 as depth 
    FROM @tbl AS tbl 
INNER JOIN CTE ON CTE.Id = tbl.LastId 
) 
SELECT top 1 total 
FROM CTE 
order by depth desc; 

我希望這會有所幫助。欲瞭解更多關於CTE的信息,我在我的網站上有幾篇文章: http://stevestedman.com/cte/