如果我有一个具有以下表结构(id,username,send_date,message)的表,如何通过Oracle SQL为不同的用户获取以前的消息
假设我有以下数据
id, username, send_date ,message
1, user A , 12.02.2018 10:08:05 ,'problem 1'
2, user B , 12.02.2018 11:34:12 ,'what ?'
3, user B , 12.02.2018 14:12:02 ,'try this'
4, user A , 13.02.2018 09:29:23 ,'see here'
5, user B , 13.02.2018 13:34:12 ,'do this'
我该怎么做呢
id, username, send_date ,message ,reply_to
1, user A , 12.02.2018 10:08:05 ,'problem 1' ,null
2, user B , 12.02.2018 11:34:12 ,'what ?' ,'problem1'
3, user B , 12.02.2018 14:12:02 ,'try this' ,'problem 1'
4, user A , 13.02.2018 09:29:23 ,'see here' ,'try this'
5, user B , 13.02.2018 13:34:12 ,'do this' ,'see here'
我的查询
select m.id, m.username, send_date, m.message,
lag(m.message) over (order by M.SEND_DATE) reply_to
from ts_messages m
order by m.send_date
返回此
id, username ,send_date ,message ,reply_to
1, user A ,12.02.2018 10:08:05 ,'problem 1' ,null
2, user B ,12.02.2018 11:34:12 ,'what ?' ,'problem1'
3, user B ,12.02.2018 14:12:02 ,'try this' ,'**what?**'
4, user A ,13.02.2018 09:29:23 ,'see here' ,'try this'
5, user B ,13.02.2018 13:34:12 ,'do this' ,'see here'
基本上,我需要在编写回复时显示我正在回复的消息,这应该是由我以外的其他人写的上一条消息
答案 0 :(得分:0)
这是一个返回所需结果的选项;但是,因为它多次访问源表,所以似乎并不高效。但是,如果那里没有那么多行,你可能会发现与假设的更好的解决方案(我无法生产,但真的很想看到)有任何区别。
SQL> with test (id, username, send_date, message) as
2 (select 1, 'user A', to_date('12.02.2018 10:08', 'dd.mm.yyyy hh24:mi'), 'problem 1' from dual union
3 select 2, 'user B', to_date('12.02.2018 11:34', 'dd.mm.yyyy hh24:mi'), 'what?' from dual union
4 select 3, 'user B', to_date('12.02.2018 14:12', 'dd.mm.yyyy hh24:mi'), 'try this' from dual union
5 select 4, 'user A', to_date('13.02.2018 09:29', 'dd.mm.yyyy hh24:mi'), 'see here' from dual union
6 select 5, 'user B', to_date('13.02.2018 13:34', 'dd.mm.yyyy hh24:mi'), 'do this' from dual
7 )
8 select
9 t.id,
10 t.username,
11 t.send_date,
12 t.message,
13 --
14 (select t2.message
15 from test t2
16 where t2.username <> t.username
17 and t2.id = (select max(t3.id)
18 from test t3
19 where t3.username <> t.username
20 and t3.id < t.id
21 )
22 ) reply_to
23 from test t
24 order by t.id;
ID USERNA SEND_DATE MESSAGE REPLY_TO
---------- ------ ---------------- --------- ---------
1 user A 12.02.2018 10:08 problem 1
2 user B 12.02.2018 11:34 what? problem 1
3 user B 12.02.2018 14:12 try this problem 1
4 user A 13.02.2018 09:29 see here try this
5 user B 13.02.2018 13:34 do this see here
SQL>