问题是这样的:有五张表,在此分别称为表A、B、C、D和E,这5个表中都有批号字段,表中数据简略陈述如下:
表A:
编号、批号、数量
1、0708001、1250表B:
编号、批号、数量
1、0708001A、500
2、0708001B、500
3、0708001、250表C:
编号、批号、数量
1、0708001A.2-1、250
2、0708001A.2-2、250
3、0708001B.2-1、250
4、0708001B.2-2、250表D:
编号、批号、数量
1、0708001A.2-1、250
2、0708001A.2-2、250表E:
编号、批号、数量
1、0708001A.2-1.01、125
2、0708001A.2-1.02、125
3、0708001A.2-2.01、125
4、0708001A.2-2.02、125
5、0708001B.2-1.01、125
6、0708001B.2-1.02、125
7、0708001B.2-2.01、125
8、0708001B.2-2.02、125
9、0708001.01、100
10、0708001.02、100
11、0708001.03、50最后要得到的结果是把这5个表连接起来组成一张表,如下:
编号A、批号A、数量A、编号B、批号B、数量B、编号C、批号C、数量C、编号D、批号D、数量D、编号E、批号E、数量E
1、0708001、1250、1、0708001A、500、1、0708001A.2-1、250、1、0708001A.2-1、250、1、0708001A.2-1.01、125
2、0708001A.2-1.02、125
2、0708001A.2-2、250、2、0708001A.2-2、250、3、0708001A.2-2.01、125
4、0708001A.2-2.02、125
2、0708001B、500、 3、0708001B.2-1、250 5、0708001B.2-1.01、125
6、0708001B.2-1.02、125
4、0708001B.2-2、250 7、0708001B.2-2.01、125
8、0708001B.2-2.02、125
3、0708001、 250、 9、0708001.01、100
10、0708001.02、100
11、0708001.03、50
请问这样的SQL查询语句该怎么写???总的原则是:这5张表间互连时,连接条件是动态的,是根据批号匹配原则去连接的。
表A:
编号、批号、数量
1、0708001、1250表B:
编号、批号、数量
1、0708001A、500
2、0708001B、500
3、0708001、250表C:
编号、批号、数量
1、0708001A.2-1、250
2、0708001A.2-2、250
3、0708001B.2-1、250
4、0708001B.2-2、250表D:
编号、批号、数量
1、0708001A.2-1、250
2、0708001A.2-2、250表E:
编号、批号、数量
1、0708001A.2-1.01、125
2、0708001A.2-1.02、125
3、0708001A.2-2.01、125
4、0708001A.2-2.02、125
5、0708001B.2-1.01、125
6、0708001B.2-1.02、125
7、0708001B.2-2.01、125
8、0708001B.2-2.02、125
9、0708001.01、100
10、0708001.02、100
11、0708001.03、50最后要得到的结果是把这5个表连接起来组成一张表,如下:
编号A、批号A、数量A、编号B、批号B、数量B、编号C、批号C、数量C、编号D、批号D、数量D、编号E、批号E、数量E
1、0708001、1250、1、0708001A、500、1、0708001A.2-1、250、1、0708001A.2-1、250、1、0708001A.2-1.01、125
2、0708001A.2-1.02、125
2、0708001A.2-2、250、2、0708001A.2-2、250、3、0708001A.2-2.01、125
4、0708001A.2-2.02、125
2、0708001B、500、 3、0708001B.2-1、250 5、0708001B.2-1.01、125
6、0708001B.2-1.02、125
4、0708001B.2-2、250 7、0708001B.2-2.01、125
8、0708001B.2-2.02、125
3、0708001、 250、 9、0708001.01、100
10、0708001.02、100
11、0708001.03、50
请问这样的SQL查询语句该怎么写???总的原则是:这5张表间互连时,连接条件是动态的,是根据批号匹配原则去连接的。
什么是动态批号匹配原则:像这样..declare @A table (编号 int,批号 nvarchar(10),数量 int)
insert into @A select 1,'0708001',1250
declare @B table (编号 int,批号 nvarchar(10),数量 int)
insert into @B select 1,'0708001A',500
union all select 2,'0708001B',500
union all select 3,'0708001',250
declare @C table (编号 int,批号 nvarchar(20),数量 int)
insert into @C select 1,'0708001A.2-1',250
union all select 2,'0708001A.2-2',250
union all select 3,'0708001B.2-1',250
union all select 4,'0708001B.2-2',250
select a.*,b.* from @A a join @B b on a.批号=LEFT(b.批号,7)
join @C on b.批号=LEFT(b.批号,8)
create table b(编号 int,批号 varchar(20),数量 int)
create table c(编号 int,批号 varchar(20),数量 int)
create table d(编号 int,批号 varchar(20),数量 int)
create table e(编号 int,批号 varchar(20),数量 int)insert a values(1,'708001',1250)
insert b values(1,'708001A',500)
insert b values(2,'708001B',500)
insert b values(3,'708001',250)
insert c values(1,'708001A.2-1',250)
insert c values(2,'708001A.2-2',250)
insert c values(3,'708001B.2-1',250)
insert c values(4,'708001B.2-2',250)
insert d values(1,'708001A.2-1',250)
insert d values(2,'708001A.2-2',250)
insert e values(1,'708001A.2-1.01',125)
insert e values(2,'708001A.2-1.02',125)
insert e values(3,'708001A.2-2.01',125)
insert e values(4,'708001A.2-2.02',125)
insert e values(5,'708001B.2-1.01',125)
insert e values(6,'708001B.2-1.02',125)
insert e values(7,'708001B.2-2.01',125)
insert e values(8,'708001B.2-2.02',125)
insert e values(9,'708001.01',100)
insert e values(10,'708001.02',100)
insert e values(11,'708001.03',50)select a.编号 编号a,a.批号 批号a,a.数量 数量a,
b.编号 编号b,b.批号 批号b,b.数量 数量b,
c.编号 编号c,c.批号 批号c,c.数量 数量c,
d.编号 编号d,d.批号 批号d,d.数量 数量d,
e.编号 编号e,e.批号 批号e,e.数量 数量e
from a left join b on a.批号=left(b.批号,len(a.批号))
left join c on b.批号=left(c.批号,len(b.批号))
left join d on c.批号=left(d.批号,len(c.批号))
left join e on d.批号=left(e.批号,len(d.批号))
order by e.编号,d.编号,c.编号,b.编号,a.编号
你给的查询是错误的,自己再测试下其实这5个表连接成一个表,可以简单陈述如下
select * from A left join B on (如果批号B最右边一位为字母,则取批号B左边len(批号B)-1位去和批号A匹配;否则直接用批号B=批号A连接)
left join C on (取批号C中.左边的部分,如果B表中存在此批号,则为left(批号C,len(批号C)-CharIndex('.',ReVerse(批号C)))=批号B;否则用此部分批号与批号A匹配)
连接C、D、E表的情况与上类似,我写上面这些的目的在于抛砖引玉