我写了一个查询,我想只是更新一些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;