当前位置: 代码迷 >> Sql Server >> update in in 多次更新有关问题
  详细解决方案

update in in 多次更新有关问题

热度:87   发布时间:2016-04-24 09:26:37.0
update in in 多次更新问题
update A set A.amount=B.amount 
where A.id in (select id from C where id in (B.id))
B.id值是多个子查询C.id也是多个。B表与C表的关系是一对多(上下层级关系),A表中的id包含了所有的id。
我执行代码时,仅更新了B.id的第一个值。请问如何根据B.id进行多次数据更新?
------解决思路----------------------
/*测试数据
;WITH ta(id,amount) AS (
    SELECT 'C',0 UNION ALL
    SELECT 'C.01',0 UNION ALL
    SELECT 'C.01.01',0 UNION ALL
    SELECT 'C.01.02',0 UNION ALL
    SELECT 'C.02',0
)
SELECT * INTO a FROM ta

;WITH tb(id,amount) AS (
    SELECT 'C.01.01',2 UNION ALL
    SELECT 'C.01.02',3 UNION ALL
    SELECT 'C.02',4
)
SELECT * INTO b FROM tb

;WITH tc(pid,cid) AS (
    SELECT 'C','C.01' UNION ALL
    SELECT 'C','C.02' UNION ALL
    SELECT 'C.01','C.01.01' UNION ALL
    SELECT 'C.01','C.01.02'
)
SELECT * INTO c FROM tc
GO
*/

CREATE TABLE #temp(
    id varchar(10),
    amount int,
    level int
)

DECLARE @level int
SET @level = 1

INSERT INTO #temp
SELECT id, amount, @level
  FROM b

WHILE @@ROWCOUNT<>0
BEGIN
    SET @level = @level+1

    INSERT INTO #temp
    SELECT c.pid, SUM(t.amount), @level
      FROM #temp t
      JOIN c
        ON c.cid = t.id
     WHERE t.level = @level-1
  GROUP BY c.pid
END

SELECT * FROM #temp ORDER BY id,level

UPDATE a
   SET a.amount = t.amount
  FROM a,
       (
            SELECT id, SUM(amount) amount
              FROM #temp
          GROUP BY id
       ) t
 WHERE a.id = t.id

SELECT * FROM a

DROP TABLE #temp

id              amount       level
---------- ----------- -----------
C                    4           2
C                    5           3
C.01                 5           2
C.01.01              2           1
C.01.02              3           1
C.02                 4           1

id           amount
------- -----------
C                 9
C.01              5
C.01.01           2
C.01.02           3
C.02              4

  相关解决方案