前一段时间被一个帐号对话记录显示的sql给难住了,这个表结构是 table test {send_id varchar2(15), recv_id varchar2(15), send_time date, context varchar2(200) } 要把帐号A与帐号B的对话记录显示出来,因为帐号A发送给帐号B 与帐号B发送给帐号A的字段不在一起这样不容易做成一个组来显示,不过最后想如果是给定帐号这样的操作就容易很多,
select * from (
select send_id,recv_id,send_times,context from test
where send_id='A' and recv_id ='B'
union
select send_id,recv_id,send_times,context from test
where send_id='B' and recv_id ='A')
order by send_time
这个是给定了两个帐号的,
如果是如定一个帐号时
select decode(bchange,1,recv_id,send_id),decode(bchange,1,send_id,recv_id), sendtime,context from(
select * from (
select send_id,recv_id,send_times,context ,0 bchange from test
where send_id='A'
union
select recv_id,send_id,send_times,context,1 bchange from test
where recv_id ='A')
order by send_id,recv_id,send_time)
这样就可以先把两个联合后再排序,到最后再交换位置
如果只给出时间条件的话,这样的还要做别一种方法,这种方法可以效果少一些,不过都可以完成前两个情况
select decode(bchange,1,recv_id,send_id),decode(bchange,1,send_id,recv_id), sendtime,context from(
select * from (
select greatest(send_id,recv_id) send_id,least(send_id,recv_id) recv_id, send_time,context,decode(greatest(send_id,recv_id),send_id,"0","1") bchange from test
where send_time between to_Date('2008-10-10') and to_Date('2008-11-10'))
order by send_id,recv_id,send_time
)
这样可以来分组显示聊天记录,可能效率会差很多,
希望大家有什么好的想法,请多多提点,谢谢