【问题标题】:Update one table from another table in pl\sql or oracle (only the rows changed from CDC table)从 pl\sql 或 oracle 中的另一个表更新一个表(仅从 CDC 表更改的行)
【发布时间】:2014-09-28 02:04:33
【问题描述】:

我想在 Oracle 11g 中编写一个更新,我想只用 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)

这不起作用...如何以正确的格式编写?

【问题讨论】:

  • 您正在尝试引用tableCDC,其范围仅存在于子查询中。

标签: sql oracle plsql oracle11g


【解决方案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
     )
);

【讨论】:

  • 当我编写上面的更新时,当我们运行一次时它工作正常,当我们第二次运行它时,所有列都更新为空。由于两个表都是相同的,所以上面的更新语句不会工作。
  • @MSBI,where exists 子句应该阻止它,让我检查一下
  • 是的,你是对的,它正在工作,非常感谢你的帮助!!
【解决方案2】:

你有语法问题。试试这个。

 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 中更新语法的更多详细信息,请单击 here

【讨论】:

  • 上面的update语句根据id和Year更新了tableA中的所有行。 where 子句 ((tableA.col1tableCDC.col1)) 未使用或无效。请帮我解决。
猜你喜欢
  • 1970-01-01
  • 2018-07-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多