2013-07-03 86 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