我想更新OFFICE_ID,OFFICE_TYPE
of FA_SUBLEDGER_MST
表,方法是根据以下条件从EMPLOYEE_MST
表中使用OFFICE_ID,OFFICE_TYPE
:
EMPLOYEE_MST.SL_CODE = FA_SUBLEDGER_MST.SL_CODE
EMPLOYEE_MST.OFFICE_ID <> SL.OFFICE_ID
OR EMPLOYEE_MST.OFFICE_TYPE <> SL.OFFICE_TYPE
AND EMPLOYEE_MST.OFFICE_TYPE != 'DHB'
我尝试了这个查询:
UPDATE FA_SUBLEDGER_MST sl
SET
(sl.OFFICE_ID, sl.OFFICE_TYPE) =
(SELECT
emp.OFFICE_ID, emp.OFFICE_TYPE
FROM EMPLOYEE_MST emp
WHERE emp.OFFICE_ID <> sl.OFFICE_ID
OR emp.OFFICE_TYPE <> sl.OFFICE_TYPE
AND sl.SL_CODE = emp.SL_CODE
AND emp.OFFICE_TYPE != 'DHB')
WHERE sl.STATUS = 'A'
AND EXISTS (SELECT 1
FROM EMPLOYEE_MST emp
WHERE emp.OFFICE_ID <> sl.OFFICE_ID
OR emp.OFFICE_TYPE <> sl.OFFICE_TYPE
AND emp.SL_CODE = sl.SL_CODE
AND emp.OFFICE_TYPE != 'DHB');
但两人都犯了这个错误:
SQL错误: ORA-01427:单行子查询返回多行 01427.00000 -“单行子查询返回多行”
这是:
UPDATE
(SELECT em.OFFICE_ID emoffid,
SL.OFFICE_ID sloffid,
em.OFFICE_TYPE emofftype,
SL.OFFICE_TYPE slemofftype,
SL.STATUS
FROM EMPLOYEE_MST em
JOIN FA_SUBLEDGER_MST SL
ON em.SL_CODE =SL.SL_CODE
WHERE em.OFFICE_ID<>SL.OFFICE_ID
OR em.OFFICE_TYPE <>SL.OFFICE_TYPE
AND em.OFFICE_TYPE!='DHB'
AND SL.STATUS ='A'
) t
SET t.sloffid =t.emoffid
WHERE t.emoffid<>t.sloffid
OR t.emofftype <>t.slemofftype
AND t.emofftype!='DHB'
AND t.STATUS ='A';
这将返回以下错误:
SQL错误: ORA-01779:无法修改映射到非密钥保存表 01779的列。00000 -“无法修改映射到非密钥保存表的列”*原因:试图插入或更新连接视图的列,该视图映射到非密钥保存的table. *操作:直接修改基础基表。
此外,这也是:
UPDATE FA_SUBLEDGER_MST
SET
(
OFFICE_ID,
OFFICE_TYPE
)
=
(SELECT OFFICE_ID,
OFFICE_TYPE
FROM EMPLOYEE_MST
WHERE (FA_SUBLEDGER_MST.OFFICE_ID != EMPLOYEE_MST.OFFICE_ID
OR FA_SUBLEDGER_MST.OFFICE_TYPE! =EMPLOYEE_MST.OFFICE_TYPE)
AND FA_SUBLEDGER_MST.SL_CODE = EMPLOYEE_MST.SL_CODE
AND EMPLOYEE_MST.OFFICE_TYPE! ='DHB'
) ;
它工作了,但它更新了所有124,451行,而满足上述指定条件的行仅为4,522行。
这两个表都包含超过10万条记录,OFFICE_ID
可以是1,2,3,4,5...18
,OFFICE_TYPE
可以是'DE','DI','HO'
,因此它们经常重复。
为此,我需要一个oracle查询。不能用手术。
会感谢你的帮助。
发布于 2015-10-07 12:12:14
您可以尝试合并而不是更新。在更新基于另一个表的表时,它通常比更新更快(我认为)更清楚。
merge into FA_SUBLEDGER_MST s1
using (
select SL_CODE, OFFICE_ID, OFFICE_TYPE
from EMPLOYEE_MST
where OFFICE_TYPE != 'DHB'
) emp
on (s1.SL_CODE = emp.SL_CODE)
when matched then update set
s1.OFFICE_ID = emp.OFFICE_ID,
s1.OFFICE_TYPE = emp.OFFICE_TYPE
where sl.STATUS = 'A'
and (s1.OFFICE_ID <> emp.OFFICE_ID
or s1.OFFICE_TYPE <> emp.OFFICE_TYPE);
确保使用-subquery不会为每个SL_CODE返回重复行
另外,最后一个示例缺少了STATUS = 'A‘条件
https://dba.stackexchange.com/questions/117245
复制相似问题