我有几张与A -> Left Join -> B -> Left join -> C
相关的表。让我们将A
称为driving table
,将B & C
称为"supporting"
表。这些表中的每个表都有一个last_update_date列。我的要求是,不仅要确定行驶表中自上次处理日期以来的更改记录(可作为参数),而且要确定支持表中任何列的更改。
Table A
------
empid|salary|last_updt_dt
123|20000|05/14/2019
Table B
-------
empid|fname|lname|last_updt_date
123|John|Taylor|05/16/2019
Table C
-------
empid|address|last_updt_dt
123|Maryland|05/17/2019
假设,= 05/10/2019
因此,假设在第1天(05/20/2019)执行作业,则输出应为:
empid|fname|lname|salary|address|last_exec_date
-----------------------------------------------
123|John|Taylor|20000|Maryland|05/20/2019
现在,让我们假设在第2天(05/21/2019),地址从Maryland
更改为California
。因此,在第2天,输出表应如下所示:
empid|fname|lname|salary|address|last_exec_date
-----------------------------------------------
123|John|Taylor|20000|Maryland|05/20/2019
123|John|Taylor|20000|California|05/21/2019
561|Peter|Anderson|50000|Missouri|05/21/2019
要注意的一点是,在第2天,任何“支持表”(在这种情况下为Table-C“地址”列)的更改均触发了另一条记录的插入,该记录已于昨天早些时候处理过,但现在具有更新的值。地址栏。另请注意,在第2天,其他插入会像其他任何符合条件的记录(如果有)的常规插入一样按原样进行。 Empid = 561。
SELECT
A.empid, B.fname, B.lname, A.salary, C.address, current_date() as last_exec_date
from A
left outer join B
on A.empid = B.empid
left outer join B.empid = C.empid
where to_date(A.last_updt_dt, 'yyyyMMdd') > {last_exec_date}
OR to_date(A.last_updt_dt, 'yyyyMMdd') > {last_exec_date}
to_date(A.last_updt_dt, 'yyyyMMdd') > {last_exec_date}
我的挑战是如何触发和传播来自任何参与的支持表的任何更改,即使该更改与先前已处理并插入到目标表的记录有关,以使新记录具有更新后的值显示在目标表中。 换句话说,如何通过其他支持(非驱动程序)表中的任何更改触发记录