ORA-01427: 单行子查询在使用 GUID(sys_Guid()) 设置父子关系时返回多行

Posted

技术标签:

【中文标题】ORA-01427: 单行子查询在使用 GUID(sys_Guid()) 设置父子关系时返回多行【英文标题】:ORA-01427: single-row sub query returns more than one row in setting up parent child relation with GUID(sys_Guid()) 【发布时间】:2019-02-18 07:58:03 【问题描述】:

我想在父子关系树表中将 Id(varchar2) 设置为 guid 类型。 我是这样复制表格的

INSERT INTO TEST_TABLE (OLD_ID,
                         ITEM_NAME,
                         PARENT_OLD_ID
                         )
   SELECT 
      OLD_ID,
      NAME,
      PARENT_OLD_ID          
 FROM TEST_TABLE  ;

然后我想更新表以设置新的父子关系,例如:

UPDATE TEST_TABLE A
  SET PARENT_GUID =
      (SELECT GUID
         FROM TEST_TABLE
        WHERE      OLD_ID = A.PARENT_OLD_ID);

我得到的错误是: ORA-01427: 单行子查询返回多于一行

我认为上面更新语句的子查询中选择了两个以上的项目。

有什么办法可以解决这个问题。

提前致谢。

【问题讨论】:

【参考方案1】:

嗯,一个简单的选项是选择 - 例如 - MAX(GUID) as

UPDATE TEST_TABLE A
  SET a.PARENT_GUID =
      (SELECT MAX(t.GUID)                   --> this
         FROM TEST_TABLE t
        WHERE      t.OLD_ID = A.PARENT_OLD_ID);

但您应该调查发生了什么 - 那些“多行”是相同的(因此 MAX 会修复它),还是它们不同,所以您宁愿不使用这种方法,而是先修复数据。

另外,我建议您在所有列名之前加上表别名。

【讨论】:

在所有列名之前加上表别名对于相关子查询来说是一个好主意,因为列名的范围跨越两个“表”(可能是另一个子查询)。任何拼写错误都可能意味着您只从一个表中读取列,而未能实现试图实现的相关部分。

以上是关于ORA-01427: 单行子查询在使用 GUID(sys_Guid()) 设置父子关系时返回多行的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01427: 单行子查询在显示输出时返回多行

ORA-01427: 单行子查询返回多行更新

ORA-01427 单行子查询返回多行 - 如何解决?

Oracle SQL:ORA-01427:单行子查询返回多于一行

ORA-01427单行子查询返回多于 1 行

查询返回:ORA-01427 单行子查询返回多于一行