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;