日期:2014-05-17  浏览次数:20710 次

SQL多表查询时,一个表的列值为另外一个表的表名,如何关联查询?
我现在的表结构是这个
list里有个列是表明这条记录内容所在的表
list表如下结构

内容表cont如下结构


两个表的GUID都是唯一的,但是有可能的情况是list有的GUID在cont里不一定有
cont有的GUID在list里不一定有,如果有的话是一一对应的。

现在我想实现的功能是:
查询得到:
GUID                                title                     msg
201210181029133794907699733564      good01  5 2013  9:53AM    呵呵,谢谢小雨!天气多变,你也要记得保暖喔!

如果list里有的就显示,如果该GUID在cont没有对应的,则msg为空
list表cont表都有很多记录,都要这样关联成一个表内容

不知道这样能不能实现。

------解决方案--------------------

select list.guid,list.title,isnull(cont.msg,'') from list left join cont on cont.guid=list.guid
------解决方案--------------------

CREATE TABLE [dbo].[list](
[GUID] [varchar](50) NOT NULL,
[title] [varchar](50) NULL,
[monthTable] [varchar](50) NULL
) ON [PRIMARY]



insert into list(guid,title,monthtable) values('111','标题1','info201201')
insert into list(guid,title,monthtable) values('222','标题2','info201202')
insert into list(guid,title,monthtable) values('333','标题3','info201203')
insert into list(guid,title,monthtable) values('444','标题4','info201204')



CREATE TABLE [dbo].[info201201](
[GUID] [varchar](50) NOT NULL,
[msg] [varchar](50) NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[info201202](
[GUID] [varchar](50) NOT NULL,
[msg] [varchar](50) NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[info201203](
[GUID] [varchar](50) NOT NULL,
[msg] [varchar](50) NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[info201204](
[GUID] [varchar](50) NOT NULL,
[msg] [varchar](50) NULL
) ON [PRIMARY]



insert into info201201(guid,msg) values('111','内容1')
insert into info201202(guid,msg) values('222','内容2')
insert into info201203(guid,msg) values('333','内容3')
insert into info201204(guid,msg) values('555','内容5')


with t
as(
select * from info201201
union all
select * from info201202
union all
select * from info201203
union all
select * from info201204
)
select
l.GUID,
l.title,
t.msg
from
[dbo].[list] l
left join
t
on
l.GUID=t.GUID
/*
GUID title msg
---------------------------------
111 标题1 内容1
222 标题2 内容2
333 标题3 内容3
444 标题4 NULL
*/

------解决方案--------------------
declare @sql nvarchar(1000)
select @sql=isnull(@sql,'')+'union all select list.guid,title,isnull(msg,'''') from list left join '+monthTable+' on list.guid='+monthTable+'.guid where list.guid='''+guid+'''' from list