2016-08-19 103 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

相关问题