当前位置: 代码迷 >> Oracle开发 >> 大家好,请教这样的语句能不能实现啊
  详细解决方案

大家好,请教这样的语句能不能实现啊

热度:145   发布时间:2016-04-24 08:02:09.0
大家好,请问这样的语句能不能实现啊?
比如我有两张表:
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(+);
  相关解决方案