日期:2014-05-19  浏览次数:20557 次

100分问题,查询两表间新增记录的问题
表a是海量视图,由n个结构相同的表组成,存储所有帐号的活动记录,且根据时间不断有新增,结构如下:
    cpaturetime             fromid       toid
2007-3-1   1:12:10           a                 b
2007-3-1   1:12:10           c                 d
2007-3-1   1:12:11           e                 f
...
2007-3-1   1:12:20           b                 a
2007-3-1   1:12:30           d                 c
...

表b是特定帐号列表,存储了几个特定帐号,不定期添加,结构如下:
username
        a
        b
...

表c结构和表a相同,是根据表b中的特定账号从表a中提取的帐号活动记录(匹配fromid或toid),初始为空表。
要求如下:
1、首先根据表b搜寻表a中的记录(匹配fromid或toid)并插入表c(无重复记录);
2、如表b有新增,重复步骤1;
3、下次执行该语句时,如表a有新增,根据表b查询表a中的相关新增记录(匹配fromid或toid),并插入表c(无重复记录)。

不知是否很复杂?


------解决方案--------------------
以下可解决第1、2个问题:
insert c
select distinct a.* from a,
(
select b.username from b
where not exists
(
select * from
(
select formid,toid from c
group by fromid,toid
)tmp
where b.username in(tmp.fromid,tmp.toid)
)
)tmp
where tmp.username in(a.fromid,a.toid)

以下可解决第3个问题:
insert c
select distinct a.* from a
(
select c.fromid,c.toid,capturetime=max(c.capturetime) from c,b
where b.username in(c.fromid,c.toid)
group by c.fromid,c.toid
)tmp
where a.fromid=tmp.fromid and a.toid=tmp.toid and c.capturetime> tmp.capturetime

lz试试。hehe
------解决方案--------------------
错了,这样

insert c
select distinct * from
(
select a.* from a
(
select c.fromid,capturetime=max(c.capturetime) from c,b
where b.username=c.fromid
group by c.fromid
)tmp
where a.fromid=tmp.fromid and c.capturetime> tmp.capturetime

union

select a.* from a
(
select c.toid,capturetime=max(c.capturetime) from c,b
where b.username=c.toid
group by c.toid
)tmp
where a.toid=tmp.toid and c.capturetime> tmp.capturetime
)tmp

再试试。