【问题标题】:How to track changes not only in the source table but also tables that are joined to it?如何不仅跟踪源表中的更改,还跟踪连接到它的表中的更改?
【发布时间】:2014-07-30 21:01:01
【问题描述】:

假设我有这个 SQL 语句:

INSERT INTO MYTABLE 
select A.code,B.name,C.add
from codes A
left join names B on A.fid=B.id
left join addresses C on B.num=C.id
where A.datechanged>somedate;

这会为 A 中被修改的每一行添加新记录。我希望它还跟踪 B 和 C 的变化,例如,如果 B.datechanged>somedate 为 true 但 A.datechanged>somedate 为 false,则仍会添加新行。

换句话说,我希望它从所有三个表中提取数据,如果 datechanged>somedate 任何表,而不仅仅是 A。我该怎么做?我打算在 FROM 子句中对不同的表重复相同的语句,但我有大约 10 个要连接的表。有没有更好的方法来做到这一点?

【问题讨论】:

  • 在每个表上触发,该表调用一个在所有 3 个“日志”表中插入记录的过程。
  • 您正在构建源代码控制吗? - 那里有免费工具
  • 也许我遗漏了一些东西,但您不只是想要OR 的多个条件,即where a.datechanged > somedate OR b.datechanged > somedate OR c.datechanged > somedate
  • 不,我正在为数据仓库做 ETL。 @xQbert您的意思是在A,B,C中更新触发器以加入其余表并在MYTABLE中插入新记录吗?如果可能的话,我宁愿避免使用触发器,这似乎只是为每个表重复相同代码的另一种方式..除非我误解了你

标签: sql oracle etl


【解决方案1】:

听起来您只想将多个谓词与OR 子句结合起来

WHERE a.datechanged > somedate
   OR b.datechanged > somedate
   OR c.datechanged > somedate

SQL 语句指定要返回的特定集合。谓词使用标准布尔代数组合以确定返回哪些行。在这种情况下,如果满足任何谓词,则将返回该行。显然,如果您使用AND 来组合谓词,那么您只会得到满足所有三个条件的行。

【讨论】:

  • 哇,我不敢相信我错过了这么基本的东西。现在需要喝下午咖啡!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 2015-12-06
  • 2023-03-25
  • 2010-09-13
相关资源
最近更新 更多