Oracle拉链表(面试常问)

42 篇文章 8 订阅
30 篇文章 9 订阅
拉链表
可以保存历史数据的表(保存每一条数据的生命周期)
  a 100  2022-01-01
  b 100  2022-01-01
  a 200  2022-01-02
         开链       闭链
a 100  2022-01-01  2022-01-02
a 200  2022-01-02  9999-12-31
b 100  2022-01-01  9999-12-31
      某条数据开链日期 要作为 上一条数据的闭链日期
  
-- 创建原表
CREATE TABLE SRC(
      ID VARCHAR2(20),
      YE NUMBER(20,2),
      DT DATE
);
INSERT INTO SRC SELECT 'A',100,DATE '2022-01-01' FROM DUAL
               UNION ALL 
               SELECT 'B',100,DATE '2022-01-01' FROM DUAL;

SELECT * FROM SRC;
-- 01-02 A有存进去100
INSERT INTO SRC SELECT 'A',200,DATE '2022-01-02' FROM DUAL;

--中间表 (只存放每天新增的数据) 增量表
CREATE TABLE ZL AS SELECT * FROM SRC WHERE 1 = 0;
INSERT INTO ZL SELECT * FROM SRC WHERE DT = DATE '2022-01-02';
SELECT * FROM ZL;

-- 创建一个最终表
CREATE TABLE LLB AS SELECT SRC.*,DATE '9999-12-31' ET FROM SRC;
SELECT * FROM LLB;


SELECT LLB.ID
     ,LLB.YE
     ,LLB.DT
     ,(CASE WHEN ZL.DT > LLB.DT THEN ZL.DT  ELSE TO_DATE('99991231','YYYYMMDD') END)
      FROM LLB LEFT JOIN ZL ON LLB.ID = ZL.ID

-- 创建决策表  jcb
CREATE TABLE JCB2 AS 
SELECT LLB.ID
     ,LLB.YE
     ,LLB.DT
     ,(CASE WHEN ZL.DT > LLB.DT THEN ZL.DT  ELSE TO_DATE('99991231','YYYYMMDD') END) ET
      FROM LLB LEFT JOIN ZL ON LLB.ID = ZL.ID


SELECT * FROM JCB2 ORDER BY DT;
-- 取01-02的数据
SELECT * FROM JCB2 WHERE DT <= DATE '2022-01-02' AND ET > DATE '2022-01-02'
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值