0

我需要通过从另一个表中复制信息来更新属性。唯一的问题是确定我必须基本上遵循这种格式所需的信息。通过匹配模型和飞机表之间的 mod_code 以及飞机和包机表之间的 ac_number 将 char_wait_chg 设置为等于从模型和飞机中选择 mod_wait_chg 的结果来更新包机表。我有一个包含 AC_Number 和 CHAR_WAIT_CHG 的 Charter 表,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));

我希望我解释得足够好,任何帮助将不胜感激。

4

1 回答 1

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) . . .

如果它不应该返回重复项,请进一步调查数据。

于 2013-07-21T22:16:44.143 回答