我有这个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
,但上述说法不起作用。有人会指出我错在哪里吗?
答案 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);
其中任何一个都修复了错误的近端原因,即子查询返回多行。但是,您需要确定您真正想要的任务。如果"任意"价值很好,然后这些工作。