oracle数据更新机制,联动更新机制思路

增量数据包含两部分:

1.增量:数据之前不存在,新产生的。

2.变量:数据之前已经存在,且发生变化的。

联动更新,是指全部源表或者个别源表有增量数据时,1)需要对增量的数据进行计算,插入目标表;2)需要对变量的数据重新计算,更新目标表原有数据。关键在于找出本次增量数据对目标表有何影响,也就是增量数据影响到了目标表哪些行,以及重新计算这些行需要源表哪些行参与计算。

举例:

源表5张:

Employees员工信息表

c88ce7b3e4518e828948d619e89c3314.png

Departments部门名称

ec1b47340eb6c61e4d4cb112d57c5ae4.png

Locations城市名称

57995cb50377bc87da1647b209b39414.png

Country_Id国家名称

01612d700a4f2a87c882593ede604c20.png

Regions洲名称

d53e01f2e8c8c2734ac14b2f2a98b181.png

目标表1张:

Destination

4415af5edb4dd105d10087d0f5e24967.png

目的:获取每个员工所在部门名称、部门所在城市名称、部门所在国家名称、部门所在洲名称,5张源表间关联关系图如下:

874971623137a657f848cd9252772d60.png

源表有增量数据时,对目标表的影响:

72623c486159e7374602824817391a77.png 

增量数据SQL:

WITH Temp AS

( --第一张表增量数据影响目标表的主键

SELECT e.Updateid

FROM Employees E

WHERE e.Updateid = 2

UNION ALL

--第二张表增量数据影响目标表的主键

SELECT e.Updateid

FROM Employees E, Departments D

WHERE e.Department_Id = d.Department_Id

AND d.Updateid = 2

UNION ALL

--第三张表增量数据影响目标表的主键

SELECT e.Updateid

FROM Employees E, Departments D, Locations c

WHERE e.Department_Id = d.Department_Id

AND d.Location_Id = c.Location_Id

AND c.Updateid = 2

UNION ALL

--第四张表增量数据影响目标表的主键

SELECT e.Updateid

FROM Employees E, Departments D, Locations c, Country_Id b

WHERE e.Department_Id = d.Department_Id

AND d.Location_Id = c.Location_Id

AND c.Country_Id = b.Country_Id

AND b.Updateid = 1

UNION ALL

--第五张表增量数据影响目标表的主键

SELECT e.Updateid

FROM Employees   E,

Departments D,

Locations   c,

Country_Id  b,

Regions     a

WHERE e.Department_Id = d.Department_Id

AND d.Location_Id = c.Location_Id

AND c.Country_Id = b.Country_Id

AND b.Region_Id = a.Region_Id

AND a.Updateid = 1)

SELECT a.Employee_Id,

a.First_Name,

a.Hire_Date,

b.Department_Name,

c.City,

d.Country_Name,

e.Region_Name,

a.Updateid,

a.Updatestate,

a.Updatetime

FROM Employees a

INNER JOIN Departments b

ON a.Department_Id = b.Department_Id AND b.UPDATESTATE <= 1

INNER JOIN Locations c

ON b.Location_Id = c.Location_Id AND c.UPDATESTATE <= 1

INNER JOIN Country_Id d

ON c.Country_Id = d.Country_Id AND d.UPDATESTATE <= 1

INNER JOIN Regions e

ON d.Region_Id = e.Region_Id AND e.UPDATESTATE <= 1

WHERE EXISTS IN

(SELECT 1 FROM Temp f WHERE a.Updateid = f.Updateid);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值