比如我有两张表:
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(+);