2016-08-19 92 views
-1

我有這條SQL語句更新SQLPLUS中的aisle from table itemloc_tblaisle from table itemloc_tmp,並且它一直返回像主題中的錯誤。更新SQL錯誤ORA-01427:單行子查詢返回多個行

更新:從itemloc_tmp

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

這是樣本數據是來自itemloc_tbl

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

樣本這是我的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) 

所以,我想更新aisle列n從itemloc_tmpitemloc_tbl,但上述聲明不起作用。有人會指出我錯在哪裏嗎?

+1

您的子查詢返回多個結果(如錯誤所示) - 應使用哪個值更新「過道」列?樣本數據和預期結果將會很有幫助。 – 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似乎沒有連接功能 – Alexander

回答

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

相關問題