使用从其他表中收集的信息更新表中的每一行

时间:2015-06-06 11:29:23

标签: sql database sql-server-2012

一个已经使用多年的旧数据库终于到了需要退役的阶段,并取代了一个更适合其所用业务需求的数据库。新的数据库已经可能旨在尽可能轻松地将现有数据从旧数据库最终传输到新数据库。然而,有一些表格,我需要在初始数据传输(或至少所有简单位)发生后执行一些更新。

SQL中的基本更新语句我很熟悉,但是迭代整个表我以前没有做过,而且我不确定最有效的方法。

通过我想做的一个例子。假设表A现在有多个字段,而不是原始对应字段。其中许多添加字段将包含可从数据库中的其他表派生的信息。因此,表A现在有一个字段,需要包含表B中两个字段中包含的信息。我想遍历表a中的每一行,并将字段x设置为等于字段c&的串联。 d表b中表b的标识字段等于表a的字段y中的值。在伪sql中就像是,

    For each row in table a
set field x = (select field c + field d from table b where id = field y)
next row

大约有8500行可供使用。每一行在字段y中都有一个有效的条目,而表b在其id字段中有id,以匹配那些,所以实际上这只是最有效的sql语句类型的一种情况来完成我所追求的这类事情。 / p>

感谢你提出的任何建议。

2 个答案:

答案 0 :(得分:0)

除非我在你的问题中遗漏了某些内容,否则你会想要做一个简单的联合更新,这可以作为基于集合的操作来完成,因此不需要使用循环。如果是这种情况,则此查询应该是您想要的:

UPDATE a
SET a.x = CONCAT(b.c, b.d) -- possibly CONCAT(b.c, ' ', b.d) if you want a separator
FROM TableA a
JOIN TableB b ON a.y = b.id

答案 1 :(得分:0)

鉴于您所描述的条件,我建议使用基于集合的更新,根据我的经验,它将是最快的。我尽可能使用基于集合的操作,而不是使用游标或某些迭代循环。

您可以查看this discussion有关基于集合的操作与单独处理行的信息。