更新SQL错误ORA-01427:单行子查询返回多行

时间:2016-08-19 03:37:11

标签: sql oracle sqlplus

我有这个SQL语句在SQLPLUS中从aisle from table itemloc_tmp更新列aisle from table itemloc_tbl,它会像在主题中一样返回错误。

更新: 这是来自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列从itemloc_tmp更新为itemloc_tbl,但上述说法不起作用。有人会指出我错在哪里吗?

1 个答案:

答案 0 :(得分: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);

其中任何一个都修复了错误的近端原因,即子查询返回多行。但是,您需要确定您真正想要的任务。如果"任意"价值很好,然后这些工作。