2016-08-19 7 views
-1

このSQL文を使用してaisle from table itemloc_tmpをSQLPLUS内のaisle from table itemloc_tblから更新し、トピックのようにエラーを戻し続けます。SQLエラーの更新ORA-01427:単一行サブクエリが複数の行を戻します

更新:itemloc_tmp

ITEM_ID  SID SEC AIS 
------------- --- --- --- 
0007AAAAAAAAA  AA3 12 
0007BBBBBBBBB  BB2 13 
0007CCCCCCCCC  CC8 11 

これはから これはサンプルデータは、これは私のSQL文

UPDATE ct.itemloc_tbl t1 SET 
    t1.aisle = (SELECT t2.aisle FROM ct.itemloc_tmp t2 WHERE t2.item_id = t1.item_id) 
    WHERE t1.item_id IN (SELECT t2.item_id FROM ct.itemloc_tmp t2 WHERE t2.item_id = t1.item_id) 

そうですitemloc_tbl

ITEM_ID  SID SEC AIS 
------------- --- --- --- 
0007AAAAAAAAA 
0007BBBBBBBBB  
0007CCCCCCCCC  

からのサンプルである、私がしたいです更新aisle列nはitemloc_tmpからitemloc_tblまでですが、上記の文は機能しません。誰かが私が間違っていた箇所を指摘するだろうか?

+1

あなたのサブクエリは複数の結果を返しています(エラーが示すように) - 'aisle'カラムを更新するのにどの値を使うべきですか?サンプルデータと期待される結果が参考になります。 – sgeddes

+0

エラーのように: 'SELECT t2.aisle FROM ct.itemloc_tmp t2 WHERE t2.item_id = t1.item_id'は複数の行を返します。 item_idの値は一意ではないと思いますか?それは普通ですか? – sstan

+0

ええ、 'item_id'と' aisle'は一意ではありません。そして、私は '通路を更新する方法を見つけようとしています。 sqlplusはjoin関数を持っていないらしいので、 – Alexander

答えて

2

更新される行を制限することができます。ここには2つの方法があります。最初rownum = 1を使用する:

UPDATE ct.itemloc_tbl t1 SET 
    SET t1.aisle = (SELECT t2.aisle FROM ct.itemloc_tmp t2 WHERE t2.item_id = t1.item_id AND rownum = 1) 
    WHERE EXISTS (SELECT 1 FROM ct.itemloc_tmp t2 WHERE t2.item_id = t1.item_id); 

第二の集約関数を使用:

UPDATE ct.itemloc_tbl t1 SET 
    SET t1.aisle = (SELECT MAX(t2.aisle) FROM ct.itemloc_tmp t2 WHERE t2.item_id = t1.item_id) 
    WHERE EXISTS (SELECT 1 FROM ct.itemloc_tmp t2 WHERE t2.item_id = t1.item_id); 

これらのいずれかが複数の行を返すサブクエリでエラーの近位の原因を修正します。ただし、割り当てに本当に必要なものを決定する必要があります。 「任意の」値がうまくいけば、これらは機能します。

+0

ありがとう、私はデータベースからサンプルデータを更新しました。 – Alexander

関連する問題