从链接服务器更新一个表

时间:2013-07-12 21:52:02

标签: sql sql-update

我需要将一个表更新到另一个表。这是我们的实时服务器,所以我想确保在申请之前已经涵盖了我的所有基础。这就是我目前所拥有的:

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](不是唯一值),然后用这些值更新TB​​L1。

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]相同的地方。

提前谢谢

2 个答案:

答案 0 :(得分:3)

您的代码存在一些轻微问题。

  1. 如果您在表中使用别名,则必须在UPDATE中使用此别名。
  2. 我认为使用连接可以简化您的代码。
  3. Example

    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