我有一个包含四列的表格。 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给出的上面的更新脚本(我很感谢)并且它说了太多行要更新。还有另外一种方法吗?
答案 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子句中进行查询。