2011-07-18 10 views
0

クエリで何が間違っていますか? (無期限に実行します)Oracleの結合クエリで更新します

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文が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); 

ようになります。それはあなたの意図ですか?または、たとえば、サブクエリで一致する行を更新するだけですか?

+0

はい、サブクエリ – DmitryB

+0

で一致するものを見つけるには、更新ステートメントがtable1のすべてのレコードを更新する必要があります。 WHERE句のないUPDATE table1 –

関連する問題