从SQL中的一个表复制数据

时间:2013-07-21 22:05:11

标签: sql join subquery using

我需要通过复制另一个表中的信息来更新属性。唯一的问题是确定我需要的信息基本上遵循这种格式。 通过更新章程表  将char_wait_chg设置为等于的结果   通过匹配从模型和飞机中选择mod_wait_chg    模型和飞机表之间的mod_code和     飞机和包机表之间的ac_number。 我有一个Charter表,其中包含AC_Number和CHAR_WAIT_CHG,Aircraft表包含AC_Number和MOD_CODE,Model表包含MOD_CODE和MOD_WAIT_CHG。我需要使CHAR_WAIT_CHG等于MOD_WAIT_CHG,我以为我可以使用子查询,但是我得到错误ORA-01427:单行子查询返回多行。这是我尝试过的:

    UPDATE CHARTER 
    SET CHAR_TOT_CHG=(SELECT MOD_WAIT_CHG FROM MODEL JOIN AIRCRAFT USING(MOD_CODE) JOIN CHARTER USING(AC_NUMBER));

我希望我能够解释得很清楚,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

这是您的查询。子查询返回多行:

UPDATE CHARTER 
    SET CHAR_TOT_CHG = (SELECT MOD_WAIT_CHG
                        FROM MODEL JOIN
                             AIRCRAFT
                             USING(MOD_CODE) JOIN
                             CHARTER
                             USING(AC_NUMBER)
                       );

您必须决定如何将其转换为一行。

第一种可能是子查询错误(因为它返回了三个表中的所有行)。

如果您真的不想在子查询中使用charter的不同副本,那么请将其设为相关子查询,这样您就不会返回所有表中的所有行:

UPDATE CHARTER 
    SET CHAR_TOT_CHG = (SELECT MOD_WAIT_CHG
                        FROM MODEL JOIN
                             AIRCRAFT
                             USING(MOD_CODE)
                        where charter.ac_number = aircraft.ac_number
                       );

可能会或可能不会解决问题。你可能仍然有重复,你必须决定如何处理它们。

如果任意行正常,则添加:

where rownum = 1

如果您想要值的min() / max() / sum() / avg(),请使用:

    SET CHAR_TOT_CHG = (SELECT sum(MOD_WAIT_CHG) . . .

如果它不应该返回重复项,那么再调查数据。