【问题标题】: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) . . .
如果它不应该返回重复项,那么请进一步调查数据。