如果现在有两个表分别是信息发送表a和信息回复表b,字段为a(a_id,a_no,a_date)、b(b_no,b_date,b_内容),由于当初建表时没有考虑日后匹配的问题,导致a,b这两个表只有a_no和b_no是相互关联的,因此在数据上难以做到一一对应,如:
a(A_ID A_NO A_DATE) b(B_内容 B_NO B_DATE)
1 3311 2009-03-21 00:06:00 m 3311 2009-03-21 01:06:00
2 3311 2009-03-21 11:06:00 j 3311 2009-03-21 11:36:00
3 3312 2009-03-22 18:06:00 u 3312 2009-03-22 18:16:00
4 3322 2009-03-23 21:06:00 m 3322 2009-03-23 21:10:00
5 3322 2009-03-23 22:46:00 m 3312 2009-03-22 19:16:00
6 3311 2009-03-21 00:16:00 u 3311 2009-03-21 00:46:00 如上数据,a表中同一个a_no在同一天可能有多条记录,b表中同一个b_no在同一天可能也有多条记录,那么在PL/SQL中进行
数据查询时怎么实现从时间上就近进行匹配,把不匹配的数据剔除,得出匹配数据。原则如下,不知能否实现:
1、如果A_NO=B_NO,表A和表B记录数一样时,按时间先后就近逐条对应匹配,如:
a(A_ID A_NO A_DATE) b(B_内容 B_NO B_DATE)
1 3311 2009-03-21 00:06:00 u 3311 2009-03-21 00:46:00
6 3311 2009-03-21 00:16:00 m 3311 2009-03-21 01:06:00
2 3311 2009-03-21 11:06:00 j 3311 2009-03-21 11:36:00 2、如果A_NO=B_NO,表A记录数多于表B记录数时,表B的数据按时间最靠近的去匹配表A的数据,然后去掉不匹配的数据,得
出结果:
a(A_ID A_NO A_DATE) b(B_内容 B_NO B_DATE)
4 3322 2009-03-23 21:06:00 m 3322 2009-03-23 21:10:00 3、如果A_NO=B_NO,表A记录数少于表B记录数时,表B的数据按时间最靠近的去匹配表A的数据,去掉不匹配的数据,得出结果:
a(A_ID A_NO A_DATE) b(B_内容 B_NO B_DATE)
3 3312 2009-03-22 18:06:00 u 3312 2009-03-22 18:16:00
a(A_ID A_NO A_DATE) b(B_内容 B_NO B_DATE)
1 3311 2009-03-21 00:06:00 m 3311 2009-03-21 01:06:00
2 3311 2009-03-21 11:06:00 j 3311 2009-03-21 11:36:00
3 3312 2009-03-22 18:06:00 u 3312 2009-03-22 18:16:00
4 3322 2009-03-23 21:06:00 m 3322 2009-03-23 21:10:00
5 3322 2009-03-23 22:46:00 m 3312 2009-03-22 19:16:00
6 3311 2009-03-21 00:16:00 u 3311 2009-03-21 00:46:00 如上数据,a表中同一个a_no在同一天可能有多条记录,b表中同一个b_no在同一天可能也有多条记录,那么在PL/SQL中进行
数据查询时怎么实现从时间上就近进行匹配,把不匹配的数据剔除,得出匹配数据。原则如下,不知能否实现:
1、如果A_NO=B_NO,表A和表B记录数一样时,按时间先后就近逐条对应匹配,如:
a(A_ID A_NO A_DATE) b(B_内容 B_NO B_DATE)
1 3311 2009-03-21 00:06:00 u 3311 2009-03-21 00:46:00
6 3311 2009-03-21 00:16:00 m 3311 2009-03-21 01:06:00
2 3311 2009-03-21 11:06:00 j 3311 2009-03-21 11:36:00 2、如果A_NO=B_NO,表A记录数多于表B记录数时,表B的数据按时间最靠近的去匹配表A的数据,然后去掉不匹配的数据,得
出结果:
a(A_ID A_NO A_DATE) b(B_内容 B_NO B_DATE)
4 3322 2009-03-23 21:06:00 m 3322 2009-03-23 21:10:00 3、如果A_NO=B_NO,表A记录数少于表B记录数时,表B的数据按时间最靠近的去匹配表A的数据,去掉不匹配的数据,得出结果:
a(A_ID A_NO A_DATE) b(B_内容 B_NO B_DATE)
3 3312 2009-03-22 18:06:00 u 3312 2009-03-22 18:16:00
1 3311 2009-03-21 00:06:00 m 3311 2009-03-21 01:06:00
2 3311 2009-03-21 11:06:00 j 3311 2009-03-21 11:36:00
3 3312 2009-03-22 18:06:00 u 3312 2009-03-22 18:16:00
4 3322 2009-03-23 21:06:00 m 3322 2009-03-23 21:10:00
5 3322 2009-03-23 22:46:00 m 3312 2009-03-22 19:16:00
6 3311 2009-03-21 00:16:00 u 3311 2009-03-21 00:46:00
QQ群 48866293 / 12035577 / 7440532 / 13666209
ACCESS专业论坛
http://www.accessbbs.cn/bbs/index.php .
http://www.office-cn.net/vvb/ .
http://www.accessoft.com/bbs/index.asp .
http://www.access-programmers.co.uk/forums .
.
http://www.office-cn.net/home/space.php?uid=141646 .
1、A打字快,B打字慢,A已经发了几条信息,结果B才回了一两条;
2、或者是A打字慢,B打字快,,A才发了一条信息,结果B回了几条;
3、又或者是A,B打字速度差不多,A发送和B回复的记录是N对N的关系。所以在这种情况下,进行记录匹配时只能模糊的去匹配,匹配时,B的时间取晚于A的;1的情况就是取A表,B表时间最靠近的记录,B的时间总晚于A的;
2的情况就是取A表,B表时间最靠近的记录,B的时间总晚于A的;
3的情况就是需要逐条匹配,取时间最靠近的,B的时间总晚于A的;
from (
SELECT a.A_ID, a.A_NO, a.A_DATE, min( b.B_DATE) as mdate
FROM a INNER JOIN b ON (a.A_DATE <= b.B_DATE) AND (a.A_NO = b.B_NO)
group by a.A_ID, a.A_NO, a.A_DATE
) a1 inner join b b1 on a1.mdate=b1.B_DATE and a1.A_NO = b1.B_NO运行结果如下A_ID|A_NO |A_DATE |B_内容|B_NO |B_DATE
1 |3311 |3/21/2009 12:06:00 AM |u |3311 |3/21/2009 12:46:00 AM
2 |3311 |3/21/2009 11:06:00 AM |j |3311 |3/21/2009 11:36:00 AM
3 |3312 |3/22/2009 6:06:00 PM |u |3312 |3/22/2009 6:16:00 PM
4 |3322 |3/23/2009 9:06:00 PM |m |3322 |3/23/2009 9:10:00 PM
6 |3311 |3/21/2009 12:16:00 AM |u |3311 |3/21/2009 12:46:00 AM