Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
从pl\sql或oracle中的另一个表更新一个表(仅从CDC表更改的行)_Sql_Oracle_Plsql_Oracle11g - Fatal编程技术网

从pl\sql或oracle中的另一个表更新一个表(仅从CDC表更改的行)

从pl\sql或oracle中的另一个表更新一个表(仅从CDC表更改的行),sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,我想在Oracle11g中编写一个更新,在这里我只想用TableCDC中的更改来更新tableA。我不想更新表A中的所有行,我只想更新在TableA和TableCDC之间更改的行 Update tableA set (tableA.col1,tableA.col2,tableA.col3) = (select col1,Col2,Col3 from tableCDC where tableA.ID = tableCDC.ID and tableA.Year = tablecdc

我想在Oracle11g中编写一个更新,在这里我只想用TableCDC中的更改来更新tableA。我不想更新表A中的所有行,我只想更新在TableA和TableCDC之间更改的行

Update tableA
set (tableA.col1,tableA.col2,tableA.col3)
 = (select col1,Col2,Col3 from tableCDC
    where tableA.ID = tableCDC.ID
    and tableA.Year = tablecdc.Year)
where (tableA.col1 <> tablecdc.col1
or tableA.col2 <> tablecdc.col2
or tableA.col3 <> tablecdc.col3)

这不起作用…如何以正确的格式写入?

您有语法问题。请尝试此操作

Update tableA A
set (col1,col2,col3)
 = ( select CDC.col1,CDC.col2, CDC.Col3
     FROM TableCDC CDC
     WHERE A.ID = CDC.ID
     AND A.YEAR = CDC.YEAR
     AND 
     (A.col1 <> CDC.col1
      OR
      A.COL2 <> CDC.COL2
      OR
      A.COL3 <> CDC.COL3
     )
)
WHERE EXISTS 
(
SELECT 1
FROM TableCDC CDC
WHERE A.ID = CDC.ID
     AND A.YEAR = CDC.YEAR
     AND 
     (A.col1 <> CDC.col1
      OR
      A.COL2 <> CDC.COL2
      OR
      A.COL3 <> CDC.COL3
     )
);
 update tableA
    set (tableA.col1,tableA.col2,tableA.col3)=
    (
    select col1,col2,col3 from tableCDC 
    where (tableA.id = tableCDC.id and tableA.year=tableCDC.year 
    and (
    (tableA.col1<>tableCDC.col1) 
    or 
    (tableA.col2<>tableCDC.col2)
    or 
    (tableA.col3<>tableCDC.col3))
    ))
    where exists 
    (select 1 from tableCDC 
    where (tableA.id = tableCDC.id and tableA.year=tableCDC.year 
    and (
    (tableA.col1<>tableCDC.col1) 
    or 
    (tableA.col2<>tableCDC.col2)
    or 
    (tableA.col3<>tableCDC.col3))
    ));

有关oracle中更新语法的更多详细信息,请单击

您正在尝试引用tableCDC,它的作用域仅存在于子查询中。当我编写上述更新时,只要运行一次,它就可以正常工作,当我们第二次运行它时,所有列都被更新为null。因为两个表都相同,所以上面的update语句不起作用。@MSBI,where exists子句应该阻止它,让我检查是的,你是对的,它起作用了。非常感谢你的帮助!!上面的update语句根据id和年份更新表中的所有行。where子句tableA.COL1 TABLEDCC.COL1未被使用或无效。请帮我解决这个问题。