更新过程中的每一行

时间:2009-11-10 16:04:11

标签: sql procedure

表TABLE1中有以下数据

文件------ FIELD1
12345个
23456个
34567个
45678个
98765

我在视图VIEW1

中有以下数据

文件----公交车 12345 ------------ 5
23456 ------------ 6
34567 ------------ 8
45678 ------------ 12
98765 ------------ 14

我想做的是更新每一行

if(table1.document = view1.document)
然后 table1.field1 = view1.bus

任何见解都会有所帮助。

谢谢。

2 个答案:

答案 0 :(得分:2)

可以使用普通SQL完成,无需任何程序:

UPDATE table1 SET field1 = (SELECT bus FROM view1 WHERE table1.document = view1.document)

或者,如果您的数据库允许它:

UPDATE (select table1.field1, view1.bus FROM table1 JOIN view1 ON table1.document = view1.document) SET table1.field1 = view1.bus

答案 1 :(得分:1)

正如丹所说,但在MS SQL Server中,我发现这种样式更容易阅读:

UPDATE U
SET U.field1 = V.bus 
FROM table1 AS U
    JOIN view1 AS V
       ON V.document = U.document

请注意,如果VIEW1对于给定的TABLE1行[DOCUMENT]值可以有多行,则选择更新的[BUS]值将在匹配集内随机更新TABLE1。 (如果是这种情况,可以修改查询以选择MAX / MIN /等。)

我会优化这个查询,以便不更新已经匹配BUS值的任何行,如果它重新运行会使它更快,因此TABLE1中已经存在一些值

UPDATE U
SET U.field1 = V.bus 
FROM table1 AS U
    JOIN view1 AS V
       ON V.document = U.document
WHERE    U.field1 = V.bus
      OR (U.field1 IS NOT NULL AND V.bus IS NULL)
      OR (U.field1 IS NULL AND V.bus IS NOT NULL)

如果字段定义为不允许NULL,则可以省略NULL / NOT NULL测试。