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;

 

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