比如我有两张表:
yinlian(银联)y_card_no    y_amt 
银联_卡号   银联_金额benhang(本行)b_card_no    b_amt
本行_卡号   本行_金额我现在要生成一个对账表,比如表结构为
duizhang(对账)y_card_no    y_amt       b_card_no    b_amt          
银联_卡号   银联_金额    本行_卡号   本行_金额  我想先把yinlian表select进duizhang表,然后用merge in to语句把benhang表一条一条按顺序和卡号、金额插入到duizhang表里,每条记录只插入一次,如果yinlian的表没有对应的记录,则置空,若同时有几条符合则按顺序插入
比如yinlian的记录是
y_card_no    y_amt 
001          100
001          100
002          200
002          300
003          100
而benhang的记录是
b_card_no    b_amt
001           100
002           200
003           100
则得到的对账表是
y_card_no    y_amt   b_card_no    b_amt
001          100     001           100
001          100
002          200     002           200
002          300
003          100     003           100
其中没有本行记录的数据是错账记录,另外银联的数据假设永远是对的,只查本行少计的记录,而银联和本行卡是严格按照时间顺序记录的,如果连续几笔同卡号,同金额的交易发生错账,假设前面发生的永远是对的,把空记录留在最后发生的几笔大家帮我想一想这样的merge into 语句怎么写啊
换句话说除了on(y_card_no=b_card_no and y_amt=b_amt)外还要加一个按顺序插入,大家帮帮我啊

解决方案 »

  1.   

    merger into duizhang  A
    using benhang B
    on ()
    when matched then
    ...
    when not matched then
    ...楼主 我觉得你的表格设计有问题
    按你说的 这是一个用户账号金额记录表 不是个交易记录表   为什么你的卡号都不能够唯一
      

  2.   

    with yinlian as(
      select '001' y_card_no, 100 y_amt from dual union all
      select '001' y_card_no, 100 y_amt from dual union all
      select '002' y_card_no, 200 y_amt from dual union all
      select '002' y_card_no, 300 y_amt from dual union all
      select '003' y_card_no, 100 y_amt from dual),
      benhang as(
      select '001' b_card_no, 100 b_amt from dual union all
      select '002' b_card_no, 200 b_amt from dual union all
      select '003' b_card_no, 100 b_amt from dual)
        
    SELECT y_card_no, y_amt, b_card_no, b_amt
      FROM (SELECT row_number() over(PARTITION BY y_card_no ORDER BY y_card_no) rn, t.* FROM yinlian t) a,
           (SELECT row_number() over(PARTITION BY b_card_no ORDER BY b_card_no) rn, t.* FROM benhang t) b
     WHERE a.y_card_no = b.b_card_no(+) AND
           a.rn = b.rn(+);
      

  3.   

    1、最好有一个产生时间来作为排序字段,如:sj,将上面的order by都改成:order by sj;
    2、将查询的数据直接插入对帐表
    INSERT INTO duzhang
      SELECT y_card_no, y_amt, b_card_no, b_amt
        FROM (SELECT row_number() over(PARTITION BY y_card_no ORDER BY y_card_no) rn, t.* FROM yinlian t) a,
             (SELECT row_number() over(PARTITION BY b_card_no ORDER BY b_card_no) rn, t.* FROM benhang t) b
       WHERE a.y_card_no = b.b_card_no(+) AND
             a.rn = b.rn(+);