逐行检查后更新表的脚本

时间:2014-09-08 09:05:31

标签: sql oracle

我有一个包含四列的表格。 Column3应该等于Column1,Column2总是等于Column4。请给我一个脚本,它将逐行检查我的表,并在检查时,如果column1和column3中的行不相等,它将更新column3中的行,因此它将等于第1列。我们的数据库是oracle 9i我对sql的经验很少,所以我希望你能帮助我。

这是table1 PACKAGE_DEALS的示例数据(但此表包含5个以上的列)

ID_NO   | ID_NAME 
--------+--------
1886103 | BMW 
1884247 | Ferrari 
3177964 | Honda 
 381677 | Volvo

这是for table2 INDIVIDUAL_DEAL(此表还有两个4列)

PLAN_ID | PLAN_NAME 
--------+----------
3177964 | Honda 
3177957 | Honda 
1886103 | BMW 
1886103 | BMW 
1884247 | Ferrari 
1884247 | Ferrari 
 381436 | Volvo 
 381677 | Volvo

我想要一个会使table2像这样的脚本。

PLAN_ID | PLAN_NAME 
--------+----------
3177964 | Honda 
3177964 | Honda 
1886103 | BMW 
1886103 | BMW 
1884247 | Ferrari 
1884247 | Ferrari 
 381677 | Volvo 
 381677 | Volvo

table2中的PLAN_ID应始终等于table1中的ID_NO。 Table2经常使用,很多人都可以访问它,所以有些数据不正确,所以我想有一个脚本来更新它并拥有正确的数据。

update table1
set col3 = (select col1 from table2 where key2 = table1.key1)
where col3 <> (select col1 from table2 where key2 = table1.key1);

我使用了thorsten给出的上面的更新脚本(我很感谢)并且它说了太多行要更新。还有另外一种方法吗?

1 个答案:

答案 0 :(得分:3)

你不需要一个脚本。一个简单的UPDATE语句就足够了。它将更新满足特定条件的所有记录(在您的情况下,column1与column3不同)。

试着自己写一下。你会看到这是多么容易。如果您碰巧遇到此问题,请再次写信并告诉我们您面临的具体问题。

编辑:根据您的评论,它表明您没有正确描述您的问题。您不是在谈论,其中一列与另一列不匹配,而是查询,其中一列与另一列不匹配。你想要做的或多或少是这样的:

update table1
set col3 = (select col1 from table2 where key2 = table1.key1)
where col3 <> (select col1 from table2 where key2 = table1.key1);

所以你要在同一个查询中写两次,一个在SET子句中,一次在WHERE子句中。

对于这种情况,Oracle提供可更新查询

update 
(
  select table1.col3, table2.col1
  from table1 
  join table2 on (table1.key1 = table2.key2)
)
set col3 = col1
where col3 <> col1;

只有当dbms认为它确保查询不会为每个table1记录检索多个结果记录时,才能执行此操作。有时会发生知道这是有保证的,但 Oracle 并不存在。它可能取决于唯一索引和复杂性。祝你好运。

如果可更新查询方法失败,仍然可以选择在SET和WHERE子句中进行查询。