【问题标题】:Oracle update: ORA-01427: single-row subquery returns more than one rowOracle 更新:ORA-01427:单行子查询返回多于一行
【发布时间】:2013-07-04 00:06:43
【问题描述】:
UPDATE TMP_COLUMNS 
    SET COLUMNNAME = (SELECT COLUMN_NAME FROM 
                      user_tab_columns usertable
                      WHERE
                      table_name = table_Name
                      AND usertable.column_id = TMP_COLUMNS.idcolumn)
    WHERE EXISTS (SELECT COLUMN_NAME 
                  FROM 
                  user_tab_columns usertable
                  WHERE
                  table_name = table_Name
                  AND usertable.column_id = TMP_COLUMNS.idcolumn);

    COMMIT;

我收到错误ORA-01427: single-row subquery returns more than one row

【问题讨论】:

  • 欢迎来到 Stackoverflow。不幸的是,这里不是real question。到目前为止,您尝试过什么吗?请先展示您的努力,以便其他人可以帮助您。另外,请阅读FAQHow to Ask

标签: oracle


【解决方案1】:

你做到了:

UPDATE TMP_COLUMNS SET COLUMNNAME = ( *SOMETHING* );

某事在哪里

SELECT COLUMN_NAME FROM user_tab_columns usertable WHERE table_name = table_Name AND usertable.column_id = TMP_COLUMNS.idcolumn

返回的内容不止一行,因此您的更新被破坏了,因为它需要知道要更新到的新值(并且该值必须是一个值,而不是多行)。

单独运行某部分并修复它以返回正确的值。

还有:不要写这么长的行;)

【讨论】:

  • 添加(并确认),来自here:Oracle 文档在 ora-01427 错误中注明了这一点*:'ORA-01427 单行子查询返回多于一行'原因: 外部查询必须使用关键字 ANY、ALL、IN 或 NOT IN 之一来指定要比较的值,因为子查询返回多行。 操作:使用 ANY、ALL、IN 或 NOT IN 来指定要比较或改写查询的值,以便只检索一行。
  • 好的,我添加了这个,但仍然失败 SELECT distinct usertable.COLUMN_NAME FROM user_tab_columns usertable,TMP_COLUMNS WHERE table_name = 'tableName' AND usertable.column_id = TMP_COLUMNS.idcolumn
【解决方案2】:

正如@mnagel 指出的那样,发生错误是因为您的子查询 (SET COLUMNNAME = SELECT ...) 返回不止一行。

问题大概出在这里:

WHERE table_name = table_Name

你需要这样做:

WHERE table_name = tmp_columns.something

或者如果tmp_columns 中没有表名列,则需要将表名作为常量提供:

WHERE table_name = 'something'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-02
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多