如何将列从一个表复制到另一个可以通过ID连接的表?

时间:2016-04-25 15:09:54

标签: sql oracle oracle11g

UPDATE    s  
SET s.TECH_NAME = r1.TECH_NAME 
FROM **ERRMSG** s INNER JOIN **RAWDATA** r1 on 
s.id = r1.id;

我想从表 RAWDATA 更新表格中的tech_name ERRMSG .Joining条件为ID.Whats在上述查询中出错。我收到以下错误

Error at Command Line : 62 Column : 1
Error report -
SQL Error: ORA-00933: SQL command not properly ended
00933. 00000 -  "SQL command not properly ended"
*Cause:    
*Action:

2 个答案:

答案 0 :(得分:0)

错误的是您使用的是Oracle不支持的语法。改为使用相关子查询:

UPDATE errmsg s  
    SET s.TECH_NAME = (SELECT r1.TECH_NAME FROM rawdata r1 WHERE s.id = r1.id)
    WHERE EXISTS (SELECT 1 FROM rawdata r1 WHERE s.id = r1.id)

答案 1 :(得分:0)

这听起来像是这里记录的MERGE声明的工作: https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm

这更符合您尝试做的精神,它避免了相关的子查询,并且它为您提供了更大的灵活性。

merge into errmsg s
   using rawdata r1
   on (s.id = r1.id)
when matched then update set s.tech_name = r1.tech_name

如果需要,您也可以使用MERGE的其他功能;例如,当NOT匹配时,errmsg表中的id在rawdata表中没有对应的id。你想在这种情况下采取行动吗?例如,您可以将tech_name设置为NULL或某个默认值或完全删除该行 - 您可以在一个 MERGE语句中执行所有这些操作。请参阅我提供的文档。