用另一个表的值更新表

时间:2018-08-13 11:22:49

标签: oracle loops join sql-update insert-update

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

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';

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

任何帮助将不胜感激。

干杯, 法比

编辑:谢谢您的答复!我对多行问题很满意,但是我却无法解决它。即使当我尝试独特的查询。但是,威廉·罗伯逊(William Robertson)的解决方案似乎行得通,非常感谢!

2 个答案:

答案 0 :(得分:0)

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"

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

答案 1 :(得分:0)

有点猜测,因为我没有您的数据或业务逻辑,但也许您想要更多类似以下内容的东西。我从子查询中删除了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将被设置为null。如果出现问题,则可以尝试将其重写为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中没有行时,它将为null。那是你要的吗?在merge版本中,如果将其设为内部联接,则合并将仅应用于存在行的地方。