2011-07-18 58 views
0

查詢中出現了什麼問題? (它無限期執行)在Oracle中使用Join查詢更新

UPDATE table1 t1 SET (t1.col,t1.Output) = (
    SELECT t2.col, t3.Output + t2.col 
    FROM tabl2 t3 
    LEFT JOIN table1 t2 ON t3.Join_Key = t2.Join_Key 
    WHERE t2.col is not NULL); 

請幫幫我。

+3

你是什麼意思「無限期執行」?它沒有完成,不解析,更新不一致的行或什麼? – Quassnoi

+0

另外,你可以用簡單的英語解釋你的意思是什麼?現在您的子查詢不相關,如果它返回多行,更新將失敗。 – Quassnoi

回答

2

您的查詢對泛型table1,table2和join_key引用沒有太多意義。

如果這不是您正在尋找的內容,那麼有一些示例數據可以幫助您更好地瞭解您要查找的結果。

update table1 t1 
    set t1.col = (select t2.col 
       from table2 t2 
       where t1.join_key = t2.join_key(+) 
        and t1.col is not null), 
     t1.output = (select t2.output + t1.col 
        from table2 t2 
        where t1.join_key = t2.join_key(+) 
        and t1.col is not null); 
4

除非你SELECT子查詢返回單行,你UPDATE聲明將失敗,錯誤

ORA-01427: single-row subquery returns more than one row 

一般來說,乳清你有相關的更新,您需要涉及外部表T1行一些條件內部子查詢中的行以確保子查詢返回單個行。這將通常看起來像

UPDATE table1 t1 SET (t1.col,t1.Output) = (
    SELECT t2.col, t3.Output + t2.col 
    FROM tabl2 t3 
    LEFT JOIN table1 t2 ON t3.Join_Key = t2.Join_Key 
    WHERE t2.col is not NULL 
    AND t1.some_key = t2.some_key); 

最後,UPDATE語句在T1更新每一行。那是你的意圖嗎?或者,您是否只想更新哪些行,例如,您在子查詢中找到匹配項?

+0

是的,我需要在子查詢中找到匹配 – DmitryB

+0

是您的更新語句更新了table1中的所有記錄。因爲UPDATE table1沒有WHERE子句 –