0

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

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] 相同的情况下更新它。

先感谢您

4

2 回答 2

3

您的代码有几个小问题。

  1. 如果您使用别名表,那么您必须在UPDATE.
  2. 我认为您的代码可以通过使用连接来简化一点。

示例

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

如果您担心不正确地更改数据,那么我强烈建议您获取它的副本/样本并首先测试您的查询。

于 2013-07-12T22:18:58.743 回答
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
于 2013-07-12T22:38:44.867 回答