问题是这样的:有五张表,在此分别称为表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张表间互连时,连接条件是动态的,是根据批号匹配原则去连接的。

解决方案 »

  1.   

    select a.编号 a.批号,a.数量 b.编号 b.批号,b.数量 c.编号 c.批号,c.数量 d.编号 d.批号,d.数量 e.编号 e.批号,e.数量  from A a inner join B b on a.批号=b.批号 inner join C  c on a.批号=c.批号 inner join D d on a.批号=d.批号 inner join E e on a.批号=e.批号  
      

  2.   


    什么是动态批号匹配原则:像这样..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)    
      

  3.   

    create table a(编号 int,批号 varchar(20),数量 int)
    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.编号
      

  4.   


    你给的查询是错误的,自己再测试下其实这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表的情况与上类似,我写上面这些的目的在于抛砖引玉