with語句使用

with概念

with提供了一種方式來書寫在一個大型查詢中使用的輔助語句,可以被看成是定義只在一個查詢中存在的臨時表。with語句被稱爲公共表表達式或CTE(Common table expression)。

with使用

with定義臨時表,支持的語句有SELECT、INSERT、UPDATE或DELETE,with定義的臨時可以被SELECT、INSERT、UPDATE或DELETE語句使用。

with使用舉例--樣例庫是Abase

#### 創建表,並插入語句

-------歷史任務表(已經運行完畢任務,一條任務會有多條記錄)
drop table if exists t_solution_task_his;
CREATE TABLE t_solution_task_his (
  c_id char(32) ,
  c_task_mc varchar(300),
  d_createtime timestamp ,
  n_status int
);
INSERT INTO t_solution_task_his(c_id, c_task_mc,  n_status, d_createtime) VALUES ('39AF47F44C178665A91FA7A6AA4E9F77', 'GP_Load', 3, '2019-09-25 17:19:44.444');
INSERT INTO t_solution_task_his(c_id, c_task_mc,  n_status, d_createtime) VALUES ('39AF47F44C178665A91FA7A6AA4E9F77', 'GP_Load', 3, '2019-09-25 17:29:24.858');
INSERT INTO t_solution_task_his(c_id, c_task_mc,  n_status, d_createtime) VALUES ('39AF47F44C178665A91FA7A6AA4E9F77', 'GP_Load', 2, '2019-09-25 17:38:18.365');
INSERT INTO t_solution_task_his(c_id, c_task_mc,  n_status, d_createtime) VALUES ('39AF47F44C178665A91FA7A6AA4E9F77', 'GP_Load', 2, '2019-09-24 16:38:18.365');
INSERT INTO t_solution_task_his(c_id, c_task_mc,  n_status, d_createtime) VALUES ('7632EF5EB2EAAB25286DDFC924FA2C59', '1',       2, '2019-11-02 14:20:13.912');
INSERT INTO t_solution_task_his(c_id, c_task_mc,  n_status, d_createtime) VALUES ('7632EF5EB2EAAB25286DDFC924FA2C59', '1',       2, '2019-11-02 14:20:58.82');
INSERT INTO t_solution_task_his(c_id, c_task_mc,  n_status, d_createtime) VALUES ('7632EF5EB2EAAB25286DDFC924FA2C59', '1',       2, '2019-11-02 14:21:40.285');
INSERT INTO t_solution_task_his(c_id, c_task_mc,  n_status, d_createtime) VALUES ('3911E80F72E99B05ED4C9B06D12D01F6', 'lww',     3, '2020-03-10 22:22:16.165');
INSERT INTO t_solution_task_his(c_id, c_task_mc,  n_status, d_createtime) VALUES ('3911E80F72E99B05ED4C9B06D12D01F6', 'lww',     3, '2020-03-10 22:24:11.186');
INSERT INTO t_solution_task_his(c_id, c_task_mc,  n_status, d_createtime) VALUES ('3911E80F72E99B05ED4C9B06D12D01F6', 'lww',     3, '2020-03-10 22:27:35.272');
-------增量記錄表
drop table if exists t_solution_task_his_zl;
CREATE TABLE t_solution_task_his_zl (
  c_id char(32) ,
  c_task_mc varchar(300),
  d_createtime timestamp,
  d_czsj timestamp ,
  c_lx varchar(300)
);

######## 查詢出任務的最新一次執行的信息

臨時表SELECT 與 主語句SELECT組合

with newtask as 
(
    select 
        c_id,
        max(d_createtime) as d_createtime
    from t_solution_task_his 
    group by c_id
)
select 
    task.c_id,
    task.c_task_mc,
    task.d_createtime,
    task.n_status
from t_solution_task_his task
left join newtask on task.c_id = newtask.c_id and task.d_createtime = newtask.d_createtime
where newtask.c_id is not null

########只保留任務最新一次執行信息

臨時表SELECT 與 主語句DELETE組合

with newtask as 
(
    select 
        c_id,
        max(d_createtime) as d_createtime
    from t_solution_task_his 
    group by c_id
)
delete from t_solution_task_his task
using newtask where task.c_id = newtask.c_id and task.d_createtime != newtask.d_createtime ;


select * from t_solution_task_his;

######## 業務表有增,刪,改時,需要在增量記錄表中記錄數據id、操作時間、操作類型

在INSERT INTO或者UPDATE語句後加上RETURNING colname,會在插入或者更新數據之後會返回你插入或者更新的數據字段。
在DELETE語句後面加上RETURNING colname,展現的爲你刪除掉的數據字段。

刪除數據
with delete as 
(
    delete from t_solution_task_his where d_createtime<='2020-01-01'
    RETURNING t_solution_task_his.*
)
insert into t_solution_task_his_zl select c_id,c_task_mc,d_createtime,now(),'D' FROM delete;
select * from t_solution_task_his;
select * from t_solution_task_his_zl;

新增數據
with insert as 
(
    insert into t_solution_task_his values ('6666E80F72E99B05ED4C9B06D12D89as', 'test',  now(),'3')
    RETURNING t_solution_task_his.*
)
insert into t_solution_task_his_zl select c_id,c_task_mc,d_createtime,now(),'I' FROM insert;
select * from t_solution_task_his;
select * from t_solution_task_his_zl;

更新數據
with update as 
(
    update  t_solution_task_his set n_status = 4 where c_id = '3911E80F72E99B05ED4C9B06D12D01F6' and d_createtime = '2020-03-10 22:27:35.272'
    RETURNING t_solution_task_his.*
)
insert into t_solution_task_his_zl select c_id,c_task_mc,d_createtime,now(),'U' FROM update;
select * from t_solution_task_his;
select * from t_solution_task_his_zl;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章