更新查询在所有行上工作,即使在oracle中选择了特定的值

  • 本文关键字:选择 oracle 查询 工作 更新 oracle
  • 更新时间 :
  • 英文 :


我写了一个查询,我想只是更新一些LINK_ID。但是它正在更新该表中的所有行。

这是我的查询

UPDATE APP_FIBERINV.TBL_FIBER_INV_CMPAPPROVED_INFO 
SET NE_LENGTH = 
(select MAINT_ZONE_NE_SPAN_LENGTH from APP_FIBERINV.TBL_FIBER_INV_JOBS  WHERE LINK_ID IN ('MORV_1020','ANND_1017','BBSR_1047','DLHI_5417','MYSR_0104'));

我仍然怀疑您发布的更新语句是否更新了表中的所有行。它必须抛出一个错误

ORA-01427:单行子查询返回多于一行

而不是,因为子查询返回五行,而它必须是一行,因为您必须为要更新的每一行找到一个值。

这意味着子查询是错误的。它选择了五行,必须选择一行。您不希望找到'MORV_1020', 'ANND_1017'的五个值,而希望找到正在更新的行的链接ID的一个值。

您还希望更新某些行(具有五个链接id的行),因此必须在更新语句的末尾添加WHERE子句。

UPDATE app_fiberinv.tbl_fiber_inv_cmpapproved_info i
SET ne_length = 
(
SELECT j.maint_zone_ne_span_length
FROM app_fiberinv.tbl_fiber_inv_jobs j
WHERE j.link_id = i.span_link_id
)
WHERE span_link_id IN ('MORV_1020', 'ANND_1017', 'BBSR_1047', 'DLHI_5417', 'MYSR_0104');

假设两个表共享LINK_ID作为主键和外键,您可以只使用MERGE:

MERGE INTO APP_FIBERINV.TBL_FIBER_INV_CMPAPPROVED_INFO APPR_NFO
USING (
SELECT LINK_ID, MAINT_ZONE_NE_SPAN_LENGTH
FROM APP_FIBERINV.TBL_FIBER_INV_JOBS 
WHERE LINK_ID IN ('MORV_1020','ANND_1017','BBSR_1047','DLHI_5417','MYSR_0104')
) INV_JOBS
ON ( APPR_NFO.SPAN_LINK_ID = INV_JOBS.LINK_ID)
WHEN MATCHED THEN UPDATE SET APPR_NFO.NE_LENGTH  = INV_JOBS.MAINT_ZONE_NE_SPAN_LENGTH;

最新更新