首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据特定条件使用另一个表的行更新一个表的行

根据特定条件使用另一个表的行更新一个表的行
EN

Database Administration用户
提问于 2015-10-07 09:40:55
回答 1查看 1.9K关注 0票数 0

我想更新OFFICE_ID,OFFICE_TYPE of FA_SUBLEDGER_MST表,方法是根据以下条件从EMPLOYEE_MST表中使用OFFICE_ID,OFFICE_TYPE

代码语言:javascript
运行
复制
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'

我尝试了这个查询:

代码语言:javascript
运行
复制
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 -“单行子查询返回多行”

这是:

代码语言:javascript
运行
复制
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. *操作:直接修改基础基表。

此外,这也是:

代码语言:javascript
运行
复制
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...18OFFICE_TYPE可以是'DE','DI','HO',因此它们经常重复。

为此,我需要一个oracle查询。不能用手术。

会感谢你的帮助。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2015-10-07 12:12:14

您可以尝试合并而不是更新。在更新基于另一个表的表时,它通常比更新更快(我认为)更清楚。

代码语言:javascript
运行
复制
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‘条件

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/117245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档