求助:表中产生新数据后,触发执行一段SQL语句

时间:2021-12-30 05:02:56

Create table User01
(
uid varchar(5),
dt date,
p1 float,
p2 float
)


Create table User02
(
uid varchar(5),
weight float
)


Create table Result
(
dt date,
CV float
)


我有上面这三张表。User01是张动态的表,间隔固定时间,表中的数据会被清空,然后插入新数据。我想要实现的业务逻辑是:当User01表插入新数据后,它要和User02表进行关联,一起运算一个公式。最后把结果值插入到Result表中。

单次执行的语句是这样的:

;with cte as(
select U1.uid, U1.dt, (U1.p1-U1.p2)*U2.weight as New_p from User01 as U1
inner join User02 as U2
on U1.uid=U2.uid
)

insert into Result
select dt, STDEV(New_p)/AVG(New_p) as CV  from cte
group by dt


如果是实时的自动运行是不是要使用触发器来做?我没用过涉及三张表的触发器,请各位帮帮忙。

5 个解决方案

#1


既然有批量清空、插入的操作,你把这句语句加在这个操作的最后不就行了。

#2


if (object_id('TR_U1', 'tr') is not null)
    drop trigger TR_U1
go

create trigger TR_U1
on  User01  --插入表中的数据
for insert
as
--定义变量
--给变量赋值
;with cte as(
select 
U1.uid, 
U1.dt, 
(U1.p1-U1.p2)*U2.weight as New_p 
from User01 as U1
inner join User02 as U2
on U1.uid=U2.uid
)
insert into Result
select dt,STDEV(New_p)/AVG(New_p) as CV  from cte
group by dt

#3


楼上的方法应该可以了

#4


User01是张动态的表,间隔固定时间,表中的数据会被清空,然后插入新数据。
--> 请问插入新数据是批量插入还是一条一条插入?
如果是批量插入,参考2楼方法即可.
如果是一条一条插入,则需等插入完成后,再执行写入Result表的语句,无法用触发器实现.

#5


引用 1 楼 Tiger_Zhao 的回复:
既然有批量清空、插入的操作,你把这句语句加在这个操作的最后不就行了。


新数据是来做爬虫程序抓取后导入数据库的。如果这一系列语句都在java程序里面写,效率会很低。你想,程序会多一个从数据库读取数据,运算完再导入数据库的操作。

#1


既然有批量清空、插入的操作,你把这句语句加在这个操作的最后不就行了。

#2


if (object_id('TR_U1', 'tr') is not null)
    drop trigger TR_U1
go

create trigger TR_U1
on  User01  --插入表中的数据
for insert
as
--定义变量
--给变量赋值
;with cte as(
select 
U1.uid, 
U1.dt, 
(U1.p1-U1.p2)*U2.weight as New_p 
from User01 as U1
inner join User02 as U2
on U1.uid=U2.uid
)
insert into Result
select dt,STDEV(New_p)/AVG(New_p) as CV  from cte
group by dt

#3


楼上的方法应该可以了

#4


User01是张动态的表,间隔固定时间,表中的数据会被清空,然后插入新数据。
--> 请问插入新数据是批量插入还是一条一条插入?
如果是批量插入,参考2楼方法即可.
如果是一条一条插入,则需等插入完成后,再执行写入Result表的语句,无法用触发器实现.

#5


引用 1 楼 Tiger_Zhao 的回复:
既然有批量清空、插入的操作,你把这句语句加在这个操作的最后不就行了。


新数据是来做爬虫程序抓取后导入数据库的。如果这一系列语句都在java程序里面写,效率会很低。你想,程序会多一个从数据库读取数据,运算完再导入数据库的操作。