来自一列的SQL UPDATE数据与另一列

时间:2018-06-08 14:40:49

标签: sql oracle sql-update

我有两个SQL表 - 一个表MODEL只有三列,另一个表我的MASTER表包含所有数据。我在MASTER表中添加了一个新列(MODEL_LONG)。我现在需要使用MODEL表中的数据更新该新列。

MODEL表只有大约40条记录。第一列是MODEL列,另外两列是MODEL_SHORT(模型的缩写名称)和MODEL_LONG(完整的模型名称)。

我需要填充刚添加到MASTER表中的新MODEL_LONG列。我需要检查MASTER TABLE的每个记录中的MODEL名称是什么,并使用MODEL表中相应的MODEL_LONG名称更新MASTER表上的MODEL_LONG列。

以下不起作用(在Oracle SQL Developer中)。我在这里缺少什么?

UPDATE MASTER
SET MASTER.MODEL_LONG = MODEL.MODEL_LONG
FROM MASTER JOIN MODEL
ON MASTER.MODEL = MODEL.MODEL;

3 个答案:

答案 0 :(得分:2)

Oracle不支持FROM中的UPDATE子句。一种方法使用相关子查询:

UPDATE MASTER
    SET MASTER.MODEL_LONG = (SELECT MODEL.MODEL_LONG
                             FROM MODEL
                             WHERE MASTER.MODEL = MODEL.MODEL
                            );

这将更新所有行。没有匹配的人获得NULL。为了防止这种情况:

UPDATE MASTER
    SET MASTER.MODEL_LONG = (SELECT MODEL.MODEL_LONG
                             FROM MODEL
                             WHERE MASTER.MODEL = MODEL.MODEL
                            )
    WHERE EXISTS (SELECT MODEL.MODEL_LONG
                  FROM MODEL
                  WHERE MASTER.MODEL = MODEL.MODEL
                 );

答案 1 :(得分:1)

您可以使用Merge Statement更新MASTER TABLE

MERGE INTO MASTER 
USING (SELECT * FROM MODEL) MODEL
ON (MASTER.MODEL = MODEL.MODEL)
WHEN MATCHED THEN UPDATE 
SET MASTER.MODEL_LONG = MODEL.MODEL_LONG;

尝试在内部查询中使用distinct关键字,因为ORA-30926错误意味着源表包含重复的ID /记录。 只是把它分开,看看它是否有帮助。

select distinct * from MODEL;

答案 2 :(得分:0)

如果你的表有适当的唯一键,你可以使用这个:

UPDATE 
   (SELECT 
        MASTER.MODEL_LONG as MASTER_MODEL_LONG, 
        MODEL.MODEL_LONG as MODEL_MODEL_LONG
    FROM MASTER JOIN MODEL ON MASTER.MODEL = MODEL.MODEL)
SET MASTER_MODEL_LONG = MODEL_MODEL_LONG;