【问题标题】:Copying data from one table in SQL在 SQL 中从一个表中复制数据
【发布时间】:2013-07-21 22:05:10
【问题描述】:

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

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

【问题讨论】:

    标签: sql join subquery using


    【解决方案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) . . .
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多