更新 SQL 错误 ORA-01427: 单行子查询 returns 多于一行

Updating SQL Error ORA-01427: single-row subquery returns more than one row

我有这个 SQL 语句来更新 SQLPLUS 中的 aisle from table itemloc_tblaisle from table itemloc_tmp,并且它不断返回主题中的错误。

更新: 这是来自 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,但上面的语句不起作用。谁能指出我错在哪里?

您可以限制正在更新的行。这里有两种方法。第一个使用 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);

其中任何一个都解决了错误的近端原因,即子查询返回多行。然而,你需要决定你真正想要的任务是什么。如果 "arbitrary" 值没问题,那么这些就可以了。