Sql 基于父项的子项总值

Sql 基于父项的子项总值,sql,postgresql,common-table-expression,recursive-query,Sql,Postgresql,Common Table Expression,Recursive Query,我有两个表:table1,table2 Parent Child Point Parent Total a b 100 a 0(default) (result = 1050) b c 200 b 0 (result = 950) c d 250

我有两个表:
table1
table2

Parent  Child  Point            Parent     Total
a       b       100               a          0(default)   (result = 1050)
b       c       200               b          0            (result = 950)
c       d       250               c          0            (result = 750)
d       e       500               
表2中的结果应为基于
表1
中父项的子项点数之和

a---b---c---d---e
我试了很多次,但都不明白

UPDATE table2 set Total=???

它伤了我的大脑。。。下面的内容应该适合您,请注意,它非常粗糙,您需要简化它

DECLARE @parent NCHAR(1), @child NCHAR(1), @runningTotal INT
SET @parent = 'a' -- set starting parent here
DECLARE myCursor CURSOR FOR SELECT [Parent], [Child], [Point] FROM table1 WHERE [Parent] = @parent
OPEN myCursor
FETCH NEXT FROM myCursor INTO @parent, @child, @runningTotal
WHILE @@FETCH_STATUS = 0
BEGIN
    IF EXISTS (SELECT * FROM table1 WHERE [Parent] = @child)
    BEGIN
        DECLARE @point INT
        SELECT @parent = [Parent], @child = [Child], @point = [Point] FROM table1 WHERE [Parent] = @child
        SET @runningTotal = @runningTotal + @point
    END
    ELSE
    BEGIN
        BREAK
    END
END
CLOSE myCursor
DEALLOCATE myCursor
SELECT @runningTotal

它伤了我的大脑。。。下面的内容应该适合您,请注意,它非常粗糙,您需要简化它

DECLARE @parent NCHAR(1), @child NCHAR(1), @runningTotal INT
SET @parent = 'a' -- set starting parent here
DECLARE myCursor CURSOR FOR SELECT [Parent], [Child], [Point] FROM table1 WHERE [Parent] = @parent
OPEN myCursor
FETCH NEXT FROM myCursor INTO @parent, @child, @runningTotal
WHILE @@FETCH_STATUS = 0
BEGIN
    IF EXISTS (SELECT * FROM table1 WHERE [Parent] = @child)
    BEGIN
        DECLARE @point INT
        SELECT @parent = [Parent], @child = [Child], @point = [Point] FROM table1 WHERE [Parent] = @child
        SET @runningTotal = @runningTotal + @point
    END
    ELSE
    BEGIN
        BREAK
    END
END
CLOSE myCursor
DEALLOCATE myCursor
SELECT @runningTotal
使用:

使用:


“基于子项和父项”的确切含义是什么?基于子项的点数总和。例如,表2中a的总数为1050。表2给出了您的结果。但你是如何根据表1计算总和的?在表1中,a只有一个子项有100个点。结果基于父项有多少个子项和合计所有。例如,a总共有4个子项,它们是b、c、d、e,但级别不同。您所说的“基于子项和父项”到底是什么意思?基于子项的点数之和。例如,表2中a的总数为1050。表2给出了您的结果。但你是如何根据表1计算总和的?在表1中,a只有一个子项有100个点。结果基于父项有多少个子项和合计所有。例如,a总共有4个子项,分别为b、c、d、e,但级别不同。这对PostgresI无效。我没有注意到问题标签,只使用SQL Server进行了测试,对于其他数据库系统,它需要一些更改—这只是解决问题的一个想法。即使在SQL Server中,它也是一个低效的解决方案(因为SQL Server也支持递归查询。基于游标的方法总是比基于集合的方法慢)这对PostgresI是无效的。我没有注意到问题标签,只使用SQL Server进行了测试。对于其他数据库系统,它需要一些更改-只是一个解决问题的想法。即使在SQL Server中,这也是一个低效的解决方案(因为SQL Server也支持递归查询。基于游标的方法总是比基于集合的方法慢)