用另一个表的值更新表

Posted

技术标签:

【中文标题】用另一个表的值更新表【英文标题】:Update table with values of another table 【发布时间】:2018-08-13 11:22:49 【问题描述】:

我正在尝试通过子查询更新表,但出现以下错误:

ORA-01427: 单行子查询返回多于一行 01427. 00000 - “单行子查询返回多于一行”

我想在列中插入第三个表格的内容。

我的查询:

UPDATE GH212_TABLE1
SET GH212_LINK = (SELECT GH201_TABLE1.GH201_ATTRIBUTEX
                  FROM GH210_TABLE3
                  LEFT JOIN GH201_TABLE1
                  ON GH210_TABLE3.GH210_GH201_ID = GH201_TABLE1.GH201_ID
                  INNER JOIN GH212_TABLE1
                  ON GH212_TABLE1.GH212_GH210_ID = GH210_ID
                  WHERE GH212_TABLE1.GH212_GH210_ID=GH210_TABLE3.GH210_ID  
                  GROUP BY GH201_ATTRIBUTEX)

WHERE GH212_TABLE1.GH212_ATTRIBUTEY='11';

我不确定如何正确链接表格,以便从一个特定对象中获取属性。

任何帮助将不胜感激。

干杯, 法比

编辑:感谢您的回复!我很擅长多行的问题,但不知何故我无法解决它。即使我尝试了不同的查询。但是威廉·罗伯逊的解决方案似乎有效,非常感谢!!

【问题讨论】:

错误很明显:您的子查询返回多行,这在更新的上下文中没有意义,更新的 RHS 只需要一个值任务。您应该向我们展示一些示例数据来解释您正在尝试做什么。 您可以在选择语句中添加 rownum =1 并且您不应该得到错误,但这是逻辑错误。 【参考方案1】:

有点猜测,因为我没有你的数据或业务逻辑,但也许你想要更像下面的东西。我已经从子查询中删除了gh212_table1 的第二个实例,而是将t3 链接回正在更新的表:

update gh212_table1 t
set    gh212_link =
       ( select distinct t1.gh201_attributex
         from   gh210_table3 t3
                left join gh201_table1 t1 on t1.gh201_id = t3.gh210_gh201_id
         where  t3.gh210_id = t.gh212_gh210_id )
where  gh212_table1.gh212_attributey = '11';

但是,如果gh212_table1 中有行子查询找不到行,那么这仍然可能存在问题,因为那些行gh212_link 将被设置为空。如果这是一个问题,您可以尝试将其重写为merge

merge into gh212_table1 tgt
using ( select distinct t3.gh210_id, t1.gh201_attributex
        from   gh210_table3 t3
               left join gh201_table1 t1 on t1.gh201_id = t3.gh210_gh201_id ) src
on    ( src.gh210_id = tgt.gh212_gh210_id )
when  matched then update
      set tgt.gh212_link = src.gh201_attributex;

当您从外连接获取gh201_attributex 时,只要gh201_table1 中没有gh210_table3 行的行,它将为空。那是你要的吗?在merge 版本中,如果将其设为内连接,则合并只会在存在行的地方应用。

【讨论】:

感谢您的回复!我很擅长多行的问题,但不知何故我无法解决它。即使我尝试了不同的查询。但是您的解决方案似乎有效,非常感谢。你打断了我的一天:)【参考方案2】:
SELECT GH201_TABLE1.GH201_ATTRIBUTEX
                  FROM GH210_TABLE3
                  LEFT JOIN GH201_TABLE1
                  ON GH210_TABLE3.GH210_GH201_ID = GH201_TABLE1.GH201_ID
                  INNER JOIN GH212_TABLE1
                  ON GH212_TABLE1.GH212_GH210_ID = GH210_ID
                  WHERE GH212_TABLE1.GH212_GH210_ID=GH210_TABLE3.GH210_ID  
                  GROUP BY GH201_ATTRIBUTEX

此查询可能会为您提供多个行值,因此您会遇到此异常

ORA-01427: single-row subquery returns more than one row 01427. 00000 - "single-row subquery returns more than one row"

确保您的子查询返回单行值。

【讨论】:

以上是关于用另一个表的值更新表的主要内容,如果未能解决你的问题,请参考以下文章

用另一个 MySQL 表的值更新一个 MySQL 表

MySQL 用另一个表的值更新一个表 - 我可以在 bigquery 中使用它吗?

用另一个表上的值更新新添加的列

用另一个表中的值更新一个表

PYSPARK:根据条件用另一个行值更新一行中的值?

用另一个表中的值更新一个表