2013-07-03 117 views
0
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甲骨文更新:ORA-01427:单行子查询返回不止一行

+0

欢迎使用Stackoverflow。不幸的是,这里不是[真正的问题](http://meta.stackexchange.com/questions/145677/what-is-a-real-question)。你到目前为止尝试过什么吗?请先显示你的努力,以便其他人可以帮助你。此外,请阅读[常见问题](http://stackoverflow.com/help)和[如何问](http://stackoverflow.com/questions/how-to-ask) – kgdesouz

回答

0

由于@mnagel指出,错误发生,因为您的子查询(SET COLUMNNAME = SELECT ...)将返回多行。

这个问题可能是在这里:

WHERE table_name = table_Name 

你需要做这样的事情,而不是:

WHERE table_name = tmp_columns.something 

或者,如果没有在tmp_columns表名称列,您需要提供表名作为常量:

WHERE table_name = 'something' 
+0

非常感谢。它现在有效 – user2501620

4

你这样做:

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 

返回多于一行的东西,所以您的更新被破坏,因为它需要知道要更新到的新值(并且需要只是一个值而不是多行)。

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

也:不要写这么长的线路;)

+1

要添加(并确认),从[here](http://www.dba-oracle.com/t_ora_01427_single_row_subquery_returns_more_than_one_row.htm): Oracle文档注意到ora-01427错误*: 'ORA-01427单行子查询返回多个行' **原因:**外部查询必须使用关键字ANY,ALL,IN或NOT IN之一来指定要比较的值,因为子查询返回多个行。 **操作:**使用ANY,ALL,IN或NOT IN来指定要比较或重新查询查询的值,以便仅检索一行。 – kgdesouz

+0

好吧,我加了这一点,但它仍然无法SELECT DISTINCT usertable.COLUMN_NAME FROM USER_TAB_COLUMNS用户表,TMP_COLUMNS WHERE TABLE_NAME = '表名' 和usertable.column_id = TMP_COLUMNS.idcolumn – user2501620