oracle 语句级触发器

yuanbo8888 2013-09-03 03:21:53
我现在有两张表一张AA表用于存放明细数据,BB表用于存放通过AA表生成的汇总数据,其中BB表中的数据想通过触发器进行实现,但是通过触发器生成的汇总数据与我实际想要的数据有很大的出入。
假设AA表信息如下:
日期 姓名 性别 身份证号
201201 张三 男 11111111
201201 李四 女 22222222
201201 王四 女 33333333
我想通过触发器得到如下结果:
BB表信息如下:
日期 性别 人数
201201 男 1
201201 女 2
但是实际触发器执行的结果是下面这种情况:
日期 性别 人数
201201 男 1
201201 女 1
201201 女 1
201201 女 2
201201 男 1
我的触发器是这样写的:
CREATE OR REPLACE TRIGGER ddd
AFTER INSERT OR UPDATE or delete ON AA
BEGIN
INSERT INTO BB(日期,性别,人数)
SELECT 日期,性别,COUNT(*) FROM AA GROUP BY 日期,性别;
END;
请各位高手帮忙看看是哪出了问题,谢谢!

...全文
392 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
gangma2 2014-03-20
  • 打赏
  • 举报
回复
上面的触发器逻辑有问题,触发器执行的时候每次都要往里面插入数据记录,导致重复的数据记录很多, 应该进行更行插入数据操作,用merge,当有重复数据记录的时候进行更新操作,没有记录的时候进行 插入操作。
sevenhc 2013-09-11
  • 打赏
  • 举报
回复
CREATE OR REPLACE TRIGGER ddd AFTER INSERT OR UPDATE or delete ON AA FOR EACH ROW BEGIN INSERT INTO BB(日期,性别,人数) SELECT NEW.日期,NEW.性别,(select COUNT(*) FROM AA where AA.日期 = NEW.日期) FROM DUAL; END; 看看这样行不
  • 打赏
  • 举报
回复
你这个没插入aa表一条都触发bb表统计插入啊,所以才这样
善若止水 2013-09-08
  • 打赏
  • 举报
回复
sql语句的问题,你的分组条件太多了
fenwaihong168 2013-09-06
  • 打赏
  • 举报
回复
LZ你这个是根据什么来统计数据量呀?
fenwaihong168 2013-09-06
  • 打赏
  • 举报
回复
对不起,整错啦。是这个呵呵
引用 7 楼 qq304213346 的回复:
CREATE OR REPLACE TRIGGER ddd AFTER INSERT OR UPDATE or delete ON AA BEGIN MERGE INTO BB p USING (SELECT 日期,性别,COUNT(*) 人数 FROM AA GROUP BY 日期,性别) np ON (p.日期 = np.日期 and p.性别=np.性别) WHEN MATCHED THEN UPDATE SET p.人数 = np.人数 WHEN NOT MATCHED THEN INSERT VALUES (np.日期, np.性别, np.人数 ) END; 试试。好像是这个思路
fenwaihong168 2013-09-06
  • 打赏
  • 举报
回复
引用 6 楼 yuanbo8888 的回复:
[quote=引用 5 楼 qq304213346 的回复:] 不能只是简单的insert吧。我认为需要判断下。 是不是需要先delete  from   aa 然后在insert 试试
先删除再插入是可以的,但是这张明细表数据量比较大,大约有百万条数据,每次都先删再插效率太慢了。[/quote] 这个好使呀,顶下
yuanbo8888 2013-09-06
  • 打赏
  • 举报
回复
引用 8 楼 fenwaihong168 的回复:
LZ你这个是根据什么来统计数据量呀?
日期,性别
请叫我-雷人 2013-09-04
  • 打赏
  • 举报
回复
CREATE OR REPLACE TRIGGER ddd AFTER INSERT OR UPDATE or delete ON AA BEGIN MERGE INTO BB p USING (SELECT 日期,性别,COUNT(*) 人数 FROM AA GROUP BY 日期,性别) np ON (p.日期 = np.日期 and p.性别=np.性别) WHEN MATCHED THEN UPDATE SET p.人数 = np.人数 WHEN NOT MATCHED THEN INSERT VALUES (np.日期, np.性别, np.人数 ) END; 试试。好像是这个思路
yuanbo8888 2013-09-03
  • 打赏
  • 举报
回复
引用 5 楼 qq304213346 的回复:
不能只是简单的insert吧。我认为需要判断下。 是不是需要先delete  from   aa 然后在insert 试试
先删除再插入是可以的,但是这张明细表数据量比较大,大约有百万条数据,每次都先删再插效率太慢了。
请叫我-雷人 2013-09-03
  • 打赏
  • 举报
回复
不能只是简单的insert吧。我认为需要判断下。 是不是需要先delete  from   aa 然后在insert 试试
yuanbo8888 2013-09-03
  • 打赏
  • 举报
回复
引用 2 楼 f_ky 的回复:
select 日期,性别,count(*) from aa group by 日期,性别;
yuanbo8888 2013-09-03
  • 打赏
  • 举报
回复
引用 1 楼 f_ky 的回复:
额。。。你这个trigger完全木有逻辑嘛 用视图就足够了!
有逻辑啊 根据日期,性别汇总生成汇总数据,把数据放到一张表中啊 视图是可以,但是数据量大的话感觉会比较慢
wumugulu 2013-09-03
  • 打赏
  • 举报
回复
select 日期,性别,count(*) from aa group by 日期,性别;
wumugulu 2013-09-03
  • 打赏
  • 举报
回复
额。。。你这个trigger完全木有逻辑嘛 用视图就足够了!

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧