使用子查询oracle更新多个记录

时间:2014-10-29 19:39:53

标签: oracle

我有两个表Table_A和Table_B Table_A具有列Id和描述 Table_B包含列Id,描述和状态。 现在,我必须更新Table_A中的描述列,以获取具有匹配ID和状态值的记录' U'在表_中。我使用了以下查询

更新Test_A   SET test_a.description =(SELECT test_b.description                             来自Test_B                             Test_A.id = Test_B.id                             并且Test_B.Status =' U')   EXISTS(SELECT id                 来自Test_B                 在哪里test_a.id = test_b.id);

但是这个查询不仅更新了匹配ID和状态为“U”的记录,还更新了Table_A中的其他行,描述为null。我在更新之前和更新之后有一些示例数据

表-A

ID |说明|
1 | A |
2 | B |
3 | C |

表-B

ID |说明|状态|
1 | AA | N |
3 | CC | U |

运行查询后,我得到以下结果

表-A

ID |说明|
1 | AA |
2 | B |
3 | (null)|

由于ID 3的标志不是' U',因此不从Table_B中选择,而是在Table_A中更新。但我期待单独使用Id 1的Table_A记录更新,所有其他记录保持不变。有人可以帮我确定哪里出错了吗?

1 个答案:

答案 0 :(得分:1)

您需要在where子句中添加额外条件:

Update Test_A 
   SET test_a.description 
          = (SELECT test_b.description From Test_B Where Test_A.id = Test_B.id And Test_B.Status='U') 
Where EXISTS (SELECT id From Test_B WHERE test_a.id = test_b.id And Test_B.Status='U');

如果TEST_B中没有NULL描述,您可以尝试这样做:

Update Test_A 
   SET test_a.description 
          = NVL((SELECT test_b.description From Test_B Where Test_A.id = Test_B.id And Test_B.Status='U'), test_a.description);

在这种情况下,所有行都将更新,但如果相关子查询返回NULL,则旧值将保留