从其他行更新一行的列值

时间:2012-04-21 07:29:19

标签: sql-server-2005

我有下表:

sno name   pid amount total
1   Arif    0   100    null 
2   Raj     1   200    null
3   Ramesh  2   100    null
4   Pooja   2   100    null
5   Swati   3   200    null
6   King    4   100    null

我想要每个人的总数,以便它给出其后代数量的总和。 对于前者

  • 对于RAJ总计将是:总数=(raj + ramesh + pooja + swati + king)的数量
  • 表示SWATI:总计=仅限于swati的数量。

1 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

WITH hierarchified AS (
  SELECT
    sno,
    amount,
    hierarchyID = CAST(sno AS varchar(500))
  FROM yourTable
  WHERE pid = 0
  UNION ALL
  SELECT
    t.sno,
    t.amount,
    hierarchyID = CAST(h.hierarchyID + '/' + RTRIM(t.sno) AS varchar(500))
  FROM yourTable t
    INNER JOIN hierarchified h ON t.pid = h.sno
)
UPDATE yourTable
SET total = t.amount + ISNULL(
  (
    SELECT SUM(amount)
    FROM hierarchified
    WHERE hierarchyID LIKE h.hierarchyID + '/%'
  ),
  0
)
FROM yourTable t
INNER JOIN hierarchified h ON t.sno = h.sno;

请注意,此查询(您可以尝试on SQL Fiddle)在大型数据集上可能效率不高。它可以作为一次性查询,然后每次更新表时组织更新总计可能会更好,即使用触发器。