日期:2014-05-16  浏览次数:20418 次

通过SQL合并表格难题
有2个表,表A记录如下:
 序号 日期  金额 户名 帐号   备注
1 2012-3-3  130 张三 11111 发工资
2 2012-3-4  140 李四 22222 发奖金
3 2012-3-5  150 王五 33333 发补贴
4 2012-3-3  130 张三 11111 发工资

 表B记录如下
 序号1 日期1 金额1 户名1 帐号1 备注1
1 2012-3-3  130  张三  11111  再发工资
2 2012-3-3  130  张三  11111  再发工资
3 2012-3-5  150  黄六  66666  发补贴

 如何通过SQL SERVER 命令,根据日期、金额和户名相等,两表核对生成以下结果

 序号 日期  金额 户名 帐号  备注 序号1 日期1 金额1 户名1 帐号1 备注1
1 2012-3-3 130 张三 11111 发工资  1  2012-3-3 130  张三  11111  再发工资
2 2012-3-4 140 李四 22222 发奖金 
3 2012-3-5 150 王五 33333 发补贴 
4 2012-3-3 130 张三 11111 发工资  2  2012-3-3 130 张三   11111  再发工资

主要的问题是按核对字段(日期、金额和户名)表B有相同的记录,如何避免表B中第1笔记录再次与表A中第4笔记录匹配上.

通过以下SQL命令无法实现
select DISTINCT A.*,B.[户名1],B.[金额1],B.[户名1],B.[帐号1],B.[备注1]
from [A] LEFT JOIN [B] ON A.[日期]=B.[日期1] AND A.[金额]=B.[金额1] AND A.[户名]=B.[户名1]
结果是如下:请注意“序号1”,表B中的第2笔记录没有与表1中的第4笔记录核对上:

序号     日期   金额   户名   帐号   备注   序号1     户名1     金额1         户名1  帐号1         备注1
 ----------- ----------------------- ----------- ---- ----------- ------ ---- ----------- ---- ----------- --------
1    2012-03-03  130  张三   11111   发工资   1    张三   130         张三   11111       再发工资
2    2012-03-04  140  李四   22222   发奖金        NULL NULL        NULL NULL        NULL
3    2012-03-03  130  张三   11111   发工资   1    张三   130         张三   11111       再发工资


有高手提出
select 序号,日期,金额, 户名,帐号,备注,序号1,日期1,金额1, 户名1,帐号1,备注1
 from (select rn=row_number() over (partition by 帐号 order by 日期,序号)from 表A) a,
 left join  (select rn=row_number() over (partition by 帐号1 order by 日期1,序号1)from 表B) b
 on a.rn=b.rn and a.帐号=b.帐号 
上述指令无法执行,请各位看客高手指教,谢谢!
------解决方案--------------------
--> 测试数据: [tb]
if object_id('[tb]') is not null drop table [tb]
create table [tb] ([序号] int,[日期] datetime,[金额] int,[户名] varchar(4),[帐号] int,[备注] varchar(6))
insert into [tb]
select&nb