正在做一个系统,表结构与下边实现新闻功能的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语句我应该怎么写呢?拜托了~~分不多了~实在不好意思~~谢谢大家

解决方案 »

  1.   

    需要根据读者表Tbl_Readers的NewsType字段,加上前缀“NewTbl_”组成一个数据库表名,动态地决定去哪个新闻类型的表中取出Title字段的内容!!!拼动态sql语句试试太长了,看不下去  ~ ^_^
      

  2.   


    这位大哥,就是因为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.拜托您能帮我看一下吗?万分感谢您
      

  3.   

    declare @theSQL varchar(1000)
    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 '%中国%'引号的问题,但这样拼出来的语句也不行。因为你的所有表都为动态的。
      

  4.   


    哦,我刚才的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语句中没有被解释,而被直接输出了!!!请问大家,我应该怎么拼接这个表示数据库表的字符串呢???
    谢谢大家了
      

  5.   

    --先把所有的结果集全部查出存到一个临时表中
    --从所有的表中合成结果的动态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语句执行结果存储到一张临时表中,
    剩下的就只有两张表的连接查询应当没问题啦吧。
      

  6.   


    TO: vfp_system(菜鸟一个)刚才确实是引号的问题但怎么样才能将这个表名拼出来呢??
    拜托您了,请指点一下
    谢谢
      

  7.   

    你的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%'NewsTbl_A.NewsType 是什么?
    你上面的做法我估计是很拼成功的。
    我的思路你考虑考虑
      

  8.   


    是啊,A.NewsType被直接输出了。怎样才能让它解释为当前记录的NewsType字段的值呢?我现在试您的方法,谢谢您了
      

  9.   


    哦,我刚才写错了输出的错误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%'
      

  10.   


    TO:xyxfly(小虾米 ^0^ 至今思项羽,不肯过江东.) 实在不好意思,没明白您的意思  ?  -_-||
      

  11.   

    declare @theSQL varchar(1000)
    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这样不行
      

  12.   

    可以参考vfp_system(菜鸟一个) ( ) 的方法或用游标
      

  13.   

    可以参考vfp_system(菜鸟一个) ( ) 的方法或用游标
      

  14.   

    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%'你这句还是错的,inner join后面要跟一个表,而你跟着是NewsTbl_A.NewsType不知道是什么?
      

  15.   

    --trydeclare @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
      

  16.   


    TO zlp321002(龙卷风2006,你的果汁,我抢一半) select出来的结果是: B on A.NewsID=B.NewsID where A.Reader like '%中国%'前边的半部分SQL语句都没了555555555~~~求您帮忙
      

  17.   

    Create table Tbl_Readers(NewsID int,NewsType varchar(10),Title varchar(10))
    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 行)
      

  18.   


    输出的SQL语句就是我需要的啊但我这里为什么就只能出现后半句SQL呢?~
      

  19.   


    换个账号~呵呵我添了如下的测试数据:
    在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表中的记录没有被取出来
    十分感谢您,再帮我看一下
      

  20.   


    相同的问题我在ASP.NET版也发了一个,大家可以参考http://community.csdn.net/Expert/topic/5043/5043322.xml?temp=.6889765请大家帮忙
      

  21.   


    TO:vfp_system(菜鸟一个) 实在不好意思,您的方法我不是很理解太菜了~不好意思您能否根据我的测试表和测试数据帮我调试一下呢?非常着急~否则我就自己琢磨了~拜托您了万分感谢
      

  22.   

    if exists(select 1 from sysobjects where type='u' and object_id('Tbl_Readers')=id)
    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           呵呵呵呵呵呵
    */