2014-09-28 106 views
0

我想在Oracle 11g中编写更新,我只想更新tableA,只更改TableCDC中的更改。我不想更新表A中的所有行,我只想更新TableA和TableCDC之间更改的行。从pl sql或oracle中的另一个表中更新一个表(仅更改从CDC表中的行)

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) 

这不工作...如何写正确的格式?

+0

您正在尝试引用tableCDC,其范围只存在于子查询。 – OldProgrammer 2014-09-28 02:22:48

回答

1
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 
    ) 
); 
+0

当我编写上述更新时,它运行正常,当我们运行一次,当我们第二次运行它时,所有的列都更新为null。因为两个表都是相同的,所以上述更新语句不起作用。 – MSBI 2014-09-28 17:37:03

+0

@MSBI,如果存在子句应该阻止它,让我检查 – radar 2014-09-28 17:50:39

+0

是的,你是对的,它的工作非常感谢你的帮助! – MSBI 2014-09-28 18:06:49

0

你有句法problem.try this。

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)) 
    )); 

有关甲骨文更新语法的更多详细信息只需点击here

+0

上述更新语句基于id和Year更新tableA中的所有行。 where子句((tableA.col1 <> tableCDC.col1))没有被使用或有效。请帮助我解决它。上面的代码 – MSBI 2014-09-28 18:02:38

+0

正常工作,我认为。 – Rumy 2014-09-29 07:35:34