一个表(tb_class)记录了新闻分类情况,其中的PID代表父分类编号,PID为0代表无上级分类,结构如下:
CID        CNAME       PID
----------------------------------
1         国内新闻      0
2         国际新闻      0
3         地方新闻      1
4         社会新闻      1
5         世界军事      2
6         各国军种      5
......通过程序中使用递归算法可得到如下的树状结构国内新闻
  |--地方新闻
  |--社会新闻
国际新闻
  |--世界军事
           |--各国军种
......
另一表记录了新闻内容(tb_news),结构如下:NEWSID      CLASSID     TITLE
-------------------
1             1        西安120亿包装城墙被指为涨地价
2             1        详解录取流程
3             2        俄用4名囚犯换回10名间谍
4             6        10人在纽约出庭认罪 
......
                    
当我在查询语句中使用select * from tb_news where classid=2 时只能查询到(国际新闻 PID=2)的文章,我想要结果是取得全部属于国际新闻的文章(包括它的子分类)有没有办法用SQL语句(或存储过程)一次性获得呢?

解决方案 »

  1.   

    select a.newsid, a. classid, a.title from tb_news a, tb_class b
    connect by prior a.classid = b.pid
    where a.classid=2;
      

  2.   

    select * from tb_news
    where CLASSID in
    (select cid 
    from tb_class
    start with cid=2
    connect by  pid=prior cid)
      

  3.   

    不好意思, 上面这个行不通, 重写了一个select a.*
    from tb_news a
    where a.classid in (
          select cid 
          from tb_class
          start with cid = 2
          connect by prior cid = pid
    );