2012-02-23 73 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/