更新 SQL 错误 ORA-01427: 单行子查询 returns 多于一行
Updating SQL Error ORA-01427: single-row subquery returns more than one row
我有这个 SQL 语句来更新 SQLPLUS 中的 aisle from table itemloc_tbl
列 aisle 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" 值没问题,那么这些就可以了。
我有这个 SQL 语句来更新 SQLPLUS 中的 aisle from table itemloc_tbl
列 aisle 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" 值没问题,那么这些就可以了。