Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于特定条件使用另一个表的行更新一个表的行_Sql_Database_Oracle_Oracle11g - Fatal编程技术网

Sql 基于特定条件使用另一个表的行更新一个表的行

Sql 基于特定条件使用另一个表的行更新一个表的行,sql,database,oracle,oracle11g,Sql,Database,Oracle,Oracle11g,我想根据以下条件,使用EMPLOYEE_MST表中的OFFICE_ID,OFFICE_TYPE更新FA_Subridger_MST表的OFFICE_ID,OFFICE_TYPE: 员工_MST.SL_代码=FA_次级账款人_MST.SL_代码 员工\u MST.OFFICE\u IDSL.OFFICE\u ID 或员工办公室类型办公室类型 和员工办公室类型!='DHB’ 我尝试了以下查询: UPDATE FA_SUBLEDGER_MST sl SET ( sl.OFFICE_ID,s

我想根据以下条件,使用EMPLOYEE_MST表中的OFFICE_ID,OFFICE_TYPE更新FA_Subridger_MST表的OFFICE_ID,OFFICE_TYPE:

员工_MST.SL_代码=FA_次级账款人_MST.SL_代码 员工\u MST.OFFICE\u IDSL.OFFICE\u ID 或员工办公室类型办公室类型 和员工办公室类型!='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:单行子查询返回多行 142700000-单行子查询返回多行

我还尝试:

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:无法修改映射到非键保留表的列 177900000-无法修改映射到非键保留表的列 *原因:试图插入或更新联接视图中映射到非键保留表的列。 *操作:直接修改基础基表

这两个表都包含超过100000条记录,OFFICE_ID可以是1、2、3、4、5,OFFICE_类型可以是“DE”、“DI”、“HO”,因此它们经常重复

我需要一个Oracle查询来执行此操作。不能使用程序

非常感谢您的帮助。

试试看

UPDATE FA_SUBLEDGER_MST
SET sl.OFFICE_ID = em.OFFICE_ID
,sl.OFFICE_TYPE = em.OFFICE_TYPE
FROM FA_SUBLEDGER_MST sl
INNER JOIN EMPLOYEE_MST em 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'
试试这个:

 WHERE (FA_SUBLEDGER_MST.OFFICE_ID != EMPLOYEE_MST.OFFICE_ID AND
        FA_SUBLEDGER_MST.OFFICE_TYPE !=EMPLOYEE_MST.OFFICE_TYPE) --AND will be converted to OR by SQL Engine
  AND FA_SUBLEDGER_MST.SL_CODE      = EMPLOYEE_MST.SL_CODE
  AND EMPLOYEE_MST.OFFICE_TYPE!     ='DHB'
  AND sl.STATUS = 'A' 
请尝试以下代码:

UPDATE FA_SUBLEDGER_MST
SET
  (
    OFFICE_ID,
    OFFICE_TYPE
  )
  =
  (SELECT OFFICE_ID,
    OFFICE_TYPE
  FROM EMPLOYEE_MST
 WHERE ....... 
  ) 
  WHERE (FA_SUBLEDGER_MST.OFFICE_ID != EMPLOYEE_MST.OFFICE_ID AND
        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'
  AND sl.STATUS = 'A' ;
最终找到了一个解决方案:


原始线程:

第二个是最近的,但您必须在子查询中引用主FA_Subridger_MST,以仅返回一行。嘿,谢谢,我在您的评论后再次查看了它,并更新FA_Subridger_MST SET OFFICE_ID,OFFICE_TYPE=选择OFFICE_ID,来自员工的办公室类型,其中FA_subgradger_MST.OFFICE_ID!=员工办公室ID或员工分帐员办公室类型=员工_MST.OFFICE_类型和FA_subgradger_MST.SL_代码=员工_MST.SL_代码和员工_MST.OFFICE_类型!='DHB';工作。只是添加了一个around或condition。但问题是它会更新所有记录。也许你也需要添加一个WHERE子句?我尝试使用WHERE子句,但无法在其中使用EMPLOYEE\u MST。相反,我尝试了:哪里有办公室ID!=从EMPLOYEE_MST中选择OFFICE_ID,其中SL_代码=FA_Subridger_MST.SL_代码和OFFICE_类型!=从“员工”列表中选择“办公室”类型,其中SL_代码=FA_Subgradger_MST.SL_代码,SL_代码=从“员工”列表中选择“办公室”代码,其中SL_代码=FA_Subgradger_MST.SL_代码,并从“员工”列表中选择“办公室”类型,其中SL_代码=FA_Subgradger_MST.SL_代码!='DHB';但它给出了一个错误:单行子查询返回多行:哦,对不起,我没有看到Oracle标记,这是SQL Server的。谢谢,它解决了一些记录没有更新的问题。但它更新了所有124451行,是否应该更新所有行?满足上述指定条件的行只有4522行。它实际上将null设置为不满足给定条件的所有其他行。您的意思是其他行124451-4522更新为null?是。。所有124451-4522行的值都被更改为NULL。问题是在更新查询EMPLOYEE_MST下的where子句中。无法由SQL标识。它给出的错误为:SQL错误:ORA-00904:EMPLOYEE\u MST.OFFICE\u类型:无效标识符00904。00000-%s:标识符无效如果您使用的是Oracle,则应使用小写字母表示IdentifierTable/列
UPDATE FA_SUBLEDGER_MST
SET
  (
    OFFICE_ID,
    OFFICE_TYPE
  )
  =
  (SELECT OFFICE_ID,
    OFFICE_TYPE
  FROM EMPLOYEE_MST
 WHERE ....... 
  ) 
  WHERE (FA_SUBLEDGER_MST.OFFICE_ID != EMPLOYEE_MST.OFFICE_ID AND
        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'
  AND sl.STATUS = 'A' ;
 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)

;