正在做一个系统,表结构与下边实现新闻功能的Demo基本相同,只不过Demo中相当于精简版
表结构如下:一、阅读人员表:Tbl_ReadersID int PK ID值
NewsID varchar 存储某一新闻条目的ID,用于与具体新闻表中的ID相连接
Reader varchar 存储本条新闻应该由谁读取
NewsType varchar 存储新闻的类型。不同类型的新闻在不同的数据库表中存储(请大家不要责怪我的数据库设计,因为这只是为了说明问题而做的Demo)
二、A新闻类型表:NewsTbl_AID int PK ID值
NewsID varchar 存储某一新闻条目的ID,用于与阅读人员表中的ID相连接
Title varchar A类型新闻的标题
三、B新闻类型表:NewsTbl_BID int PK ID值
NewsID varchar 存储某一新闻条目的ID,用于与阅读人员表中的ID相连接
Title varchar B类型新闻的标题
四、C、D、E ......新闻类型表(表的个数不定,由新闻类型的个数决定)
在阅读人员表Tbl_Readers的NewsType字段当中,存储了新闻的类型,如A、B等,并且加上前缀 NewTbl_ 就相当于存储该类型的新闻的数据库表的名称!!!
现在,我想按下边的格式取出某个读者所有的新闻列表:NewsID(新闻ID)、NewsType(新闻类型)、Title(新闻标题)
这也就意味着:
需要根据读者表Tbl_Readers的NewsType字段,加上前缀“NewTbl_”组成一个数据库表名,动态地决定去哪个新闻类型的表中取出Title字段的内容!!!
请问大家,这样的SQL语句我应该怎么写呢?拜托了~~分不多了~实在不好意思~~谢谢大家
表结构如下:一、阅读人员表:Tbl_ReadersID int PK ID值
NewsID varchar 存储某一新闻条目的ID,用于与具体新闻表中的ID相连接
Reader varchar 存储本条新闻应该由谁读取
NewsType varchar 存储新闻的类型。不同类型的新闻在不同的数据库表中存储(请大家不要责怪我的数据库设计,因为这只是为了说明问题而做的Demo)
二、A新闻类型表:NewsTbl_AID int PK ID值
NewsID varchar 存储某一新闻条目的ID,用于与阅读人员表中的ID相连接
Title varchar A类型新闻的标题
三、B新闻类型表:NewsTbl_BID int PK ID值
NewsID varchar 存储某一新闻条目的ID,用于与阅读人员表中的ID相连接
Title varchar B类型新闻的标题
四、C、D、E ......新闻类型表(表的个数不定,由新闻类型的个数决定)
在阅读人员表Tbl_Readers的NewsType字段当中,存储了新闻的类型,如A、B等,并且加上前缀 NewTbl_ 就相当于存储该类型的新闻的数据库表的名称!!!
现在,我想按下边的格式取出某个读者所有的新闻列表:NewsID(新闻ID)、NewsType(新闻类型)、Title(新闻标题)
这也就意味着:
需要根据读者表Tbl_Readers的NewsType字段,加上前缀“NewTbl_”组成一个数据库表名,动态地决定去哪个新闻类型的表中取出Title字段的内容!!!
请问大家,这样的SQL语句我应该怎么写呢?拜托了~~分不多了~实在不好意思~~谢谢大家
解决方案 »
- 无法打开默认数据库,登录失败是什么原因?
- 急:为什么文本数据不能够插入到MSSQL中?
- sql2008问取消unique约束
- 能否用一条sql语句读出该表中的字段名称?
- 请叫各位前辈这个存储过程怎么写??
- EXEC sp_adduser 'a51118101',NULL,db_owner [/code] 是不是顺序不对头啊 怎么添加用户靠后了?
- 关于自动出现的SET FMTONLY ON
- t-sql语句求助
- 这个sql如何写
- 相当急!本地服务器不能连接,高手请帮助
- 请教各位高手,不开机运行SQL Server 2000问题
- 急啊.求大家帮帮忙 我的sql数据库安装完后数据库里面没数据是怎么回事啊.
这位大哥,就是因为SQL语句我拼不出来啊-_-||我是这样写的:
declare @theSQL varchar(1000)
declare @thetable varchar(50)
set @theSQL = 'SELECT A.NewsID,A.NewsType,B.Title from Tbl_Readers A inner join'
set @thetable = ' NewsTbl_'+'A.NewsType'
set @theSQL = @theSQL + @thetable + ' B on A.NewsID=B.NewsID where A.Reader like '%'+ @thereader +'%''select @theSQL
提示的错误是:The data types varchar and varchar are incompatible in the modulo operator.拜托您能帮我看一下吗?万分感谢您
declare @thetable varchar(50)
declare @thereader varchar(20)
set @theSQL = 'SELECT A.NewsID,A.NewsType,B.Title from Tbl_Readers A inner join'
set @thetable = ' NewsTbl_'+'A.NewsType'
set @thereader='中国'
set @theSQL = @theSQL + @thetable + ' B on A.NewsID=B.NewsID where A.Reader like ''%'+ @thereader +'%'''select @theSQLSELECT A.NewsID,A.NewsType,B.Title from Tbl_Readers A inner join NewsTbl_A.NewsType
B on A.NewsID=B.NewsID where A.Reader like '%中国%'引号的问题,但这样拼出来的语句也不行。因为你的所有表都为动态的。
哦,我刚才的SQL中有一点小问题,改后可以执行成功了,但拼凑出来的SQL语句不正确!拼出来的SQL语句是:SELECT A.NewsID,A.NewsType,B.Title from Tbl_Readers A inner join NewsTbl_A.NewsType on A.NewsID=B.NewsID where A.Reader like '%username%'也就是说,A.NewsType在SQL语句中没有被解释,而被直接输出了!!!请问大家,我应该怎么拼接这个表示数据库表的字符串呢???
谢谢大家了
--从所有的表中合成结果的动态SQL拼法如下
declare @SelectChild nvarchar(100)
declare @UnionSQL nvarchar(100)
declare @SQL nvarchar(2000)
declare @i int
set @i=1
set @SQL=''
set @SelectChild='select * from NewsTbl_'
set @UnionSQL=' union all '
while @i<=3
begin
if @i<3
set @SQL=@SQL+@SelectChild+ltrim(str(@i))+@UnionSQL
else
set @SQL=@SQL+@SelectChild+ltrim(str(@i))
set @i=@i+1
end
print @SQL
结果如下:
select * from NewsTbl_1 union all
select * from NewsTbl_2 union all
select * from NewsTbl_3
再把上面的SQL语句执行结果存储到一张临时表中,
剩下的就只有两张表的连接查询应当没问题啦吧。
TO: vfp_system(菜鸟一个)刚才确实是引号的问题但怎么样才能将这个表名拼出来呢??
拜托您了,请指点一下
谢谢
SELECT A.NewsID,A.NewsType,B.Title from Tbl_Readers A
inner join NewsTbl_A.NewsType on A.NewsID=B.NewsID where A.Reader like '%username%'NewsTbl_A.NewsType 是什么?
你上面的做法我估计是很拼成功的。
我的思路你考虑考虑
是啊,A.NewsType被直接输出了。怎样才能让它解释为当前记录的NewsType字段的值呢?我现在试您的方法,谢谢您了
哦,我刚才写错了输出的错误SQL语句是这样的:SELECT A.NewsID,A.NewsType,B.Title from Tbl_Readers A
inner join NewsTbl_A.NewsType B on A.NewsID=B.NewsID where A.Reader like '%username%'
TO:xyxfly(小虾米 ^0^ 至今思项羽,不肯过江东.) 实在不好意思,没明白您的意思 ? -_-||
declare @thetable varchar(50)
declare @thereader varchar(20)
set @theSQL = 'SELECT A.NewsID,A.NewsType,B.Title from Tbl_Readers A inner join'
set @thetable = ' NewsTbl_'+'A.NewsType'
set @thereader='中国'
set @theSQL = @theSQL + @thetable + ' B on A.NewsID=B.NewsID where A.Reader like ''%'+ @thereader +'%'''select @theSQL这样不行
inner join NewsTbl_A.NewsType B on A.NewsID=B.NewsID where A.Reader like '%username%'你这句还是错的,inner join后面要跟一个表,而你跟着是NewsTbl_A.NewsType不知道是什么?
declare @thereader varchar(20)
set @thereader='中国'
SET @theSQL=''
SELECT @theSQL = 'SELECT A.NewsID,A.NewsType,B.Title from Tbl_Readers A inner join NewsTbl_'+''+NewsType+''
FROM Tbl_Readers
set @theSQL = @theSQL + ' B on A.NewsID=B.NewsID where A.Reader like ''%'+ @thereader +'%'''
select @theSQL
TO zlp321002(龙卷风2006,你的果汁,我抢一半) select出来的结果是: B on A.NewsID=B.NewsID where A.Reader like '%中国%'前边的半部分SQL语句都没了555555555~~~求您帮忙
insert into Tbl_Readers
select 1,'a','中国'declare @theSQL varchar(1000)
declare @thereader varchar(20)
set @thereader='中国'
SET @theSQL=''
SELECT @theSQL = 'SELECT A.NewsID,A.NewsType,B.Title from Tbl_Readers A inner join NewsTbl_'+''+NewsType+''
FROM Tbl_Readers
set @theSQL = @theSQL + ' B on A.NewsID=B.NewsID where A.Reader like ''%'+ @thereader +'%'''
select @theSQL--结果
SELECT A.NewsID,A.NewsType,B.Title from Tbl_Readers A inner join NewsTbl_a B on A.NewsID=B.NewsID where A.Reader like '%中国%'(所影响的行数为 1 行)
输出的SQL语句就是我需要的啊但我这里为什么就只能出现后半句SQL呢?~
换个账号~呵呵我添了如下的测试数据:
在Tbl_Readers表中:ID NewsID Reader NewsType
1 111 中国 A
2 222 中国 B
在NewsTbl_A表中:ID NewsID Title
1 111 哈哈哈哈哈哈
在NewsTbl_B表中:ID NewsID Title
1 222 呵呵呵呵呵呵
可是根据您的语句:
SELECT A.NewsID,A.NewsType,B.Title from Tbl_Readers A inner join NewsTbl_a B on A.NewsID=B.NewsID where A.Reader like '%中国%'只能出现结果:
ID NewsType TItle
111 A 哈哈哈哈哈哈而NewsTbl_B表中的记录没有被取出来
十分感谢您,再帮我看一下
相同的问题我在ASP.NET版也发了一个,大家可以参考http://community.csdn.net/Expert/topic/5043/5043322.xml?temp=.6889765请大家帮忙
TO:vfp_system(菜鸟一个) 实在不好意思,您的方法我不是很理解太菜了~不好意思您能否根据我的测试表和测试数据帮我调试一下呢?非常着急~否则我就自己琢磨了~拜托您了万分感谢
drop table Tbl_Readers
if exists(select 1 from sysobjects where type='u' and object_id('NewsTbl_A')=id)
drop table NewsTbl_A
if exists(select 1 from sysobjects where type='u' and object_id('NewsTbl_B')=id)
drop table NewsTbl_B
gocreate table Tbl_Readers(ID int not null identity primary key,NewsID varchar(20) not null,Reader varchar(10) not null,NewsType varchar(10) not null)
create table NewsTbl_A(ID int not null identity primary key,NewsID varchar(20) not null,Title varchar(100) not null)
create table NewsTbl_B(ID int not null identity primary key,NewsID varchar(20) not null,Title varchar(100) not null)
goinsert Tbl_Readers
select '111','中國','A' union all
select '222','中國','B' union all
select '333','美國','B' insert NewsTbl_A
select '111','哈哈哈哈哈哈'insert NewsTbl_B
select '222','呵呵呵呵呵呵' union all
select '333','呵呵呵呵呵呵'
goselect * from Tbl_Readers
/*
ID NewsID Reader NewsType
1 111 中? A
2 222 中? B
3 333 美國 B
*/select * from NewsTbl_A
/*
ID NewsID Title
1 111 哈哈哈哈哈哈
*/select * from NewsTbl_B
/*
ID NewsID Title
1 222 呵呵呵呵呵呵
1 333 嘿嘿嘿嘿嘿嘿
*/
declare @sql nvarchar(1000),@reader varchar(10)
set @sql=''
set @reader='中國'
select @sql=@sql+'select A.NewsID,A.NewsType,B.Title from Tbl_Readers a join NewsTbl_'+NewsType+' b on A.NewsID=B.NewsID and Reader='''+@reader+''' union all ' from Tbl_Readers where Reader=@reader group by NewsType
if @sql<>''
begin
select @sql=left(@sql,len(@sql)-9)
--select @sql
exec(@sql)
end
/*
ID NewsType TItle
111 A 哈哈哈哈哈哈
222 B 呵呵呵呵呵呵
*/--declare @sql nvarchar(1000),@reader varchar(10)
set @sql=''
set @reader='美國'
select @sql=@sql+'select A.NewsID,A.NewsType,B.Title from Tbl_Readers a join NewsTbl_'+NewsType+' b on A.NewsID=B.NewsID and Reader='''+@reader+''' union all ' from Tbl_Readers where Reader=@reader group by NewsType
if @sql<>''
begin
select @sql=left(@sql,len(@sql)-9)
--select @sql
exec(@sql)
end
/*
ID NewsType TItle
333 B 呵呵呵呵呵呵
*/