日期:2014-05-17  浏览次数:20754 次

大家好,请问这样的语句能不能实现啊?
比如我有两张表:
yinlian(银联)
CSS code

y_card_no    y_amt 
银联_卡号   银联_金额


benhang(本行)
CSS code

b_card_no    b_amt
本行_卡号   本行_金额


我现在要生成一个对账表,比如表结构为
duizhang(对账)
CSS code

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)外还要加一个按顺序插入,大家帮帮我啊




------解决方案--------------------
SQL code
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(+);