比如我有两张表:
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)外还要加一个按顺序插入,大家帮帮我啊
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)外还要加一个按顺序插入,大家帮帮我啊
using benhang B
on ()
when matched then
...
when not matched then
...楼主 我觉得你的表格设计有问题
按你说的 这是一个用户账号金额记录表 不是个交易记录表 为什么你的卡号都不能够唯一
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(+);
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(+);