我需要通过复制另一个表中的信息来更新属性。唯一的问题是确定我需要的信息基本上遵循这种格式。 通过更新章程表 将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));
我希望我能够解释得很清楚,任何帮助都会受到赞赏。
答案 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) . . .
如果它不应该返回重复项,那么再调查数据。