select
        * 
    from
        (select
            a.resultid,
            a.dataid,
            a.tiptext,
            b.title,
            b.content,
            b.issuetime,
            b.url,
            rownum as rn 
        from
            r_resultnews a 
        left join
            v_chn_news b 
                on a.dataid=b.dataid 
        where
            a.classid=2378 
            and siteid in (
                select
                    siteid 
                from
                    tg_eventstatic 
                where
                    datatype=1 
                    and eventclass=2378 
                    and positionid='北京'
            ) 
            and rownum>0
        ) 
    where
        rn>0 
        and rn<=30

解决方案 »

  1.   

    siteid 是r_resultnews 的 还是 是v_chn_news 的
      

  2.   


    SELECT *
      FROM (SELECT A.RESULTID,
                   A.DATAID,
                   A.TIPTEXT,
                   B.TITLE,
                   B.CONTENT,
                   B.ISSUETIME,
                   B.URL,
                   ROWNUM AS RN
              FROM R_RESULTNEWS A
              LEFT JOIN V_CHN_NEWS B
                ON A.DATAID = B.DATAID
             WHERE A.CLASSID = 2378
               AND EXISTS(SELECT 1 FROM TG_EVENTSTATIC c 
                          WHERE a.SITEID=c.SITEID
                            AND DATATYPE = 1
                            AND EVENTCLASS = 2378
                            AND POSITIONID = '北京')           
               AND ROWNUM > 0)
     WHERE RN > 0
       AND RN <= 30这样会不会好点
      

  3.   

    --select *
    --  from (
      select a.resultid,
                   a.dataid,
                   a.tiptext,
                   b.title,
                   b.content,
                   b.issuetime,
                   b.url,
                   rownum as rn
              from r_resultnews a
              left join v_chn_news b on a.dataid = b.dataid
             where a.classid = 2378
               and exists (select 1 from tg_eventstatic
                               where datatype = 1
                                 and eventclass = 2378
                                 and positionid = '北京')
             and rn <= 30--由于子句中未做排序 外面再包一层没有任何区别不是吗 一句的效率肯定比两句高
               /*--修改原则  exists 效率高于left join 高于in
               and siteid in (select siteid
                                from tg_eventstatic
                               where datatype = 1
                                 and eventclass = 2378
                                 and positionid = '北京')
               */
               --and rownum > 0 --这个条件任何时间都有效 不需要写
    --           )
    -- where rn > 0
    --   and rn <= 30