如果现在有两个表分别是信息发送表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 

解决方案 »

  1.   

    实现如下的匹配,看颜色(黑色为不匹配,需要剔除)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 
      

  2.   

    你的描述上还是有些地方不太清晰。 1. 是否B表中的对应记录都比A表晚? 比如A表是 2009-10-12 13:04:02, B表中 2009-10-12 13:04:00 , 2009-10-12 13:04:05 这两条取哪一条? 2. 匹配的最大容差是多少? 比如A,B表中都仅有一条记录  A:2009-10-12 13:04:02 B:2009-12-22 23:24:22 这种情况下是否算两条记录匹配?因为很显然这两条记录是最近的。 如果不算,为什么? 
    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 .
      

  3.   

    1、B表的记录要取比A时间晚的,这种情况的话,取B表的记录2009-10-12 13:04:05 去和A表的进行匹配。2、匹配时容差最大值是一天,因为A主要功能是记录发送的信息,B表是作为记录回复信息的表,所以匹配得出的记录B的时间要晚于A表,但是两个表中都没有其他第二个的字段可以关联,所以只能是近似匹配了。
      

  4.   

    表A主要记录的发送的信息,表B是记录回复的信息我的情况就像是两个人聊Q时,可能会出现:
    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的;
      

  5.   

    select a1.A_ID, a1.A_NO, a1.A_DATE,b1.B_内容,b1.B_NO,b1.B_DATE
    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