日期:2014-05-18  浏览次数:20714 次

两表横向联合的sql问题
有两个表:
表A:
    id         data           type
    0001       26             AA1
    0002       23             AA1
    0003       56             AA1
    0004       25             AA1

表B:
    id         data           type
    0001       24             AA0
    0002       26             AA0
    0005       23             AA0
    0001       26             AA2
    0006       26             AA2
其中b表的type可以有多个值,如AA3、AA4、AB1等等

想获得的结果是:
    id       AA0-data     AA1-data     AA2-data
  0001     24                   26               26
  0002     26                   23
  0003                           56                    
  0004                           25
  0005     23
  0006                                               26

即:查询的结果包含了两表的所有的id,并且b表中type有几种值,查询后的列数就是(其值的个数+a表type列中值的个数)。

请问这样的问题有什么办法来实现?
如果一条sql实现不了,还有什么其他的办法呢?或者程序也可。

------解决方案--------------------
create table a(id varchar(10),data varchar(10),type varchar(10))
insert into a values( '0001 ', '26 ', 'AA1 ')
insert into a values( '0002 ', '23 ', 'AA1 ')
insert into a values( '0003 ', '56 ', 'AA1 ')
insert into a values( '0004 ', '25 ', 'AA1 ')
create table b(id varchar(10),data varchar(10),type varchar(10))
insert into b values( '0001 ', '24 ', 'AA0 ')
insert into b values( '0002 ', '26 ', 'AA0 ')
insert into b values( '0005 ', '23 ', 'AA0 ')
insert into b values( '0001 ', '26 ', 'AA2 ')
insert into b values( '0006 ', '26 ', 'AA2 ')
go

declare @sql varchar(8000)
set @sql = 'select id '
select @sql = @sql + ' , min(case type when ' ' ' + type + ' ' ' then data end) [ ' + type + '] '
from (select distinct type from (select * from a union all select * from b) m) as t
set @sql = @sql + ' from (select * from a union all select * from b) m group by id '
exec(@sql)

drop table a,b
/*
id AA0 AA1 AA2
---------- ---------- ---------- ----------
0001 24 26