送分100!!!! 简单SQL问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
我有一个存储新闻分类的表(mulu)字段如下: 
 mulu_id   (int)   分类表里用的唯一ID,自动生成 
 mulu_fid   (int)   父ID,0表示根目录 
 mulu_name   (varchar(255))   分类名称   
 还有一个存储新闻内容的表(news)主要字段如下: 
 news_id   (int)   新闻表里唯一ID,自动生成 
 mulu_id   (int)   对应mulu表里的mulu_id 
 news_title   (varchar(300))   新闻标题 
 ..... 
 .....   
 mulu表内容如下: 
 mulu_name      mulu_id      mulu_fid    
    =========================== 
     '首页新闻 '            1                     0    
     '心情故事 '            2                     1    
     '网友推荐 '            3                     1    
     '游戏相关 '            4                     3    
     '其它 '                        5                     3    
 ..... 
 .....   
 问题: 
 如何用sql语句把 '首页新闻 '分类及它的子分类下的所有新闻读出来?   
 不知道我说清楚没有   
 提示:最好不要用   SELECT      *   FROM   news   where   mulu_id   in   (....)   这样的语句 
 因为分类的子分类有可能太多,这样性能可能不好 
 求别的解决方法 
------解决方案--------------------try     
 Select A.* From news A Inner Join mulu B On A.mulu_id = B.mulu_id Where B.mulu_name =  '首页新闻 ' 
 Union All 
 Select A.* From news A Inner Join mulu B On A.mulu_id = B.mulu_id Inner Join mulu C On B.mulu_fid = C.mulu_id Where C.mulu_name =  '首页新闻 '
------解决方案--------------------up
------解决方案--------------------〉〉我会把整张表都拿到DataTable里去处理,那个效率可快多了   
 上万客户并发,你的服务器就走掉了
------解决方案--------------------用游标你的服务器基本死定了,因为它是一条条查下来的,   
 而楼主这个要求又是要递归查询,应该说是不可能性能好的   
 一般的做法是表里再加一个字段(以0,1组成),表示出层次关系,这样查询的效果会好的多
------解决方案--------------------create function func_child 
 ( 
    @id char(10) 
 )returns @tb (id char(10),level int) 
 as 
 begin 
  declare @level int 
  set @level = 1   
  insert into @tb  
  select @id,@level    
  while @@rowcount >  0 
  begin 
   set @level = @level + 1 
   insert into @tb 
   select a.mulu_id,@level from mulu a,@tb b 
   where a.mulu_fid = b.id and b.level = @level - 1 
  end   
  return 
 end   
 /*结果*/ 
 select * from news a,dbo.func_child( '1 ') b 
 where a.mulu_id = b.id