Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用从其他表收集的信息更新表中的每一行_Sql_Database_Sql Server 2012 - Fatal编程技术网

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

Sql 使用从其他表收集的信息更新表中的每一行,sql,database,sql-server-2012,Sql,Database,Sql Server 2012,一个已经使用多年的旧数据库终于达到了需要退役的阶段,并被一个更适合其所用业务需求的数据库所取代。在可能的情况下,新数据库的设计使现有数据从旧数据库最终传输到新数据库的过程尽可能轻松。不过,有几个表,在初始数据传输(或至少所有简单的部分)完成后,我需要在其中执行一些更新 我熟悉SQL中的基本update语句,但我以前从未对整个表进行过迭代,也不确定最有效的方法 举个例子说明我想做什么。假设表A现在比原来的对应表多了几个字段。其中许多添加字段将包含从数据库中的其他表派生的信息。因此,表A现在有一个字

一个已经使用多年的旧数据库终于达到了需要退役的阶段,并被一个更适合其所用业务需求的数据库所取代。在可能的情况下,新数据库的设计使现有数据从旧数据库最终传输到新数据库的过程尽可能轻松。不过,有几个表,在初始数据传输(或至少所有简单的部分)完成后,我需要在其中执行一些更新

我熟悉SQL中的基本update语句,但我以前从未对整个表进行过迭代,也不确定最有效的方法

举个例子说明我想做什么。假设表A现在比原来的对应表多了几个字段。其中许多添加字段将包含从数据库中的其他表派生的信息。因此,表A现在有一个字段,需要包含表B中两个字段中包含的信息。我想遍历表A中的每一行,并将字段x设置为等于表B中字段c和d的串联,其中表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语句类型的一个例子


感谢您的建议。

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

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

根据您描述的条件,我建议使用基于集合的更新,根据我的经验,这将是最快的更新。我尽可能地使用基于集合的操作,而不是像现在这样使用游标或某种迭代循环

您可以了解基于集合的操作与单独处理行的关系