我需要将一个表更新到另一个表。这是我们的实时服务器,所以我想确保在申请之前已经涵盖了我的所有基础。这就是我目前所拥有的:
UPDATE [LinkedServer].[DB1].[dbo].[TBL1]
SET t1.[COL1] = t1.[COL1] + (SELECT SUM(t2.[COL2] - t2.[COL1])
FROM [DB2].[dbo].[TBL2] t2
where [TBL2COL3]=203 and t1.[COL0]=t2.[COL0]))
FROM [LinkedServer].[DB1].[dbo].[TBL1] t1
WHERE t1.[COL0]=t2.[COL0]
基本上我试图总结DB2 t1中两列的差异。[COL0](唯一值)= t2。[COL0](不是唯一值),然后用这些值更新TBL1。
t1.[COL1] + (SELECT SUM(t2.[COL2] - t2.[COL1])
FROM [DB2].[dbo].[TBL2] t2
where [TBL2COL3]=203 and t1.[COL0]=t2.[COL0]))
上面的代码提供了我需要的正确数据,我只需要知道这是否是更新其他表的正确方法。我需要它只更新t1。[COL0]和t2。[COL0]相同的地方。
提前谢谢
答案 0 :(得分:3)
您的代码存在一些轻微问题。
UPDATE
中使用此别名。 UPDATE a1 -- alias of table being updated used here
SET a1.n = a1.n + a2.s
FROM t1 a1
JOIN (
SELECT id, SUM(n - m) s
FROM t2
GROUP BY id
) a2 ON a2.id = a1.id
--WHERE a1.id = 1
如果您担心错误地更改数据,那么我强烈建议您先复制一份数据并对其进行测试,然后再对其进行测试。
答案 1 :(得分:0)
Where子句中的t2别名未绑定任何内容。我想你希望它来自你的子查询,但那时你已经聚合了符合你标准的所有行(包括t1.col0 = t2.col0)。 此外,您正在尝试更新tbl1表,但您要设置t1.col1。
你需要更多的东西:
update [LinkedServer].db1.dbo.tbl1
set tbl1.col1 = tbl1.col1 + iv_aggregate.total
from [LinkedServer].db1.dbo.tbl1
join (
select tbl2.col0, sum(tbl2.col2 - tbl2.col1) total
from db2.dbo.tbl2
where tbl2.col3 = 203
group by tbl2.col0 ) iv_aggreagate
on iv_aggregate.col0 = tbl1.col0
from [LinkedServer].db1.dbo.tbl1