从pl\sql或oracle中的另一个表更新一个表(仅从CDC表更改的行)
我想在Oracle11g中编写一个更新,在这里我只想用TableCDC中的更改来更新tableA。我不想更新表A中的所有行,我只想更新在TableA和TableCDC之间更改的行从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
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未被使用或无效。请帮我解决这个问题。