我现在有三个表,一个是客户积分档案表yx_jfdab记录了每一位客户各月的积分,一个是客户兑奖积分累加表(yx_jfdab)记录每一个客户每一次兑奖后的用掉的累加积分,其中XFJF为消费积分,ZWJF为在网积分,JLJF为奖励各分,yd为已兑的拼声。三客户档案表(yx_yhdab)记录客户基本信息,我现在要从总积分>500的记录中(从积分高低排序)取出前任意名,请问这条sql语句该怎么写啊
我写的SQL语句如下,通过ROWNUM>50取出的好像不是总积分按排序后的前50名,虽然能取出50名也按从高到低排序,但是好像不是所有记录中总积分最高的在最前,而是当前显示的前50条中的记录的最高分最前,请问该怎么办?同时请问该语句该怎么优化
非常感谢
select rownum ,a.dhhm dhhm,c.khmc khmc,a.zxfjf-nvl(b.ydxfjf,0) dqxfjf,a.zzwjf-nvl(b.ydzwjf,0) dqzwjf,a.zjljf-nvl(b.ydjljf,0) dqjljf 
       ,a.zxfjf-nvl(b.ydxfjf,0)+a.zzwjf-nvl(b.ydzwjf,0)+a.zjljf-nvl(b.ydjljf,0)+nvl(b.ljjzjf,0) zjf,nvl(b.ljdf,0) ljdf,nvl(b.ljjzjf,0) ljjzjf from 
(select dhhm,sum(xfjf) zxfjf,sum(zwjf) zzwjf,sum(jljf) zjlj from          yx_jfdab group by dhhm)A,
(select dhhm,ydxfjf,ydzwjf,ydjljf,ljdf,ljjzjf from yx_jfdjljb)B,
(select dhhm,khmc,blzd8 from jfxt.yx_yhdab)C
where a.dhhm=b.dhhm(+) and a.zxfjf-nvl(b.ydxfjf,0)+a.zzwjf-nvl(b.ydzwjf,0)+a.zjljf-nvl(b.ydjljf,0)+nvl(b.ljjzjf,0)>500
and a.dhhm=c.dhhm and rownum<50 order by zjf desc;

解决方案 »

  1.   

    放到ORACLE没有人回答,看看DELPHI版的兄弟姐妹能不能帮我,分不够再加,
      

  2.   

    从数据库中提取符合条件的前n条记录的sql语句写法为:
    select top n  *  from 表名 where 条件值  ;其中n为一整数
      

  3.   

    我以前用INFORMIX是这样的
    select first 10* from wt_xxxx
    就是取前面的10条记录
    不知道ORACLE怎么样
      

  4.   

    不要用rownum<50 ,用Top 50 来取。
      

  5.   

    是什么数据库吗?
    MSSQL Server是在SELECT语句中加入“first”关键字;
    DB2是在SELECT语句中加入“TOP”关键字;
    Oracle忘记了,是有一关键字可处理的。
      

  6.   

    TO:forgot(忘记forgot2000) 
    怎么写了,举个简单的例子行吗,我在PB下用SELECT TOP 50调试不过
      

  7.   

    select top 50 rownum ,a.dhhm dhhm,c.khmc khmc,a.zxfjf-nvl(b.ydxfjf,0) dqxfjf,a.zzwjf-nvl(b.ydzwjf,0) dqzwjf,a.zjljf-nvl(b.ydjljf,0) dqjljf 
           ,a.zxfjf-nvl(b.ydxfjf,0)+a.zzwjf-nvl(b.ydzwjf,0)+a.zjljf-nvl(b.ydjljf,0)+nvl(b.ljjzjf,0) zjf,nvl(b.ljdf,0) ljdf,nvl(b.ljjzjf,0) ljjzjf from 
    (select dhhm,sum(xfjf) zxfjf,sum(zwjf) zzwjf,sum(jljf) zjlj from          yx_jfdab group by dhhm)A,
    (select dhhm,ydxfjf,ydzwjf,ydjljf,ljdf,ljjzjf from yx_jfdjljb)B,
    (select dhhm,khmc,blzd8 from jfxt.yx_yhdab)C
    where a.dhhm=b.dhhm(+) and a.zxfjf-nvl(b.ydxfjf,0)+a.zzwjf-nvl(b.ydzwjf,0)+a.zjljf-nvl(b.ydjljf,0)+nvl(b.ljjzjf,0)>500
    and a.dhhm=c.dhhm and rownum<50 order by zjf desc;可以吗?
      

  8.   

    select top 50 * from 表名 
    为什么在sqlplus和PB中都调试不过啊select top 50 rownum * from 表名 
    也不行
    要取排在前50名到底该怎么写啊,帮帮我吧
      

  9.   

    select top 10 * from sales
        where qty>=20
        order by qty asc
      

  10.   

    select * from tab where rownum<=50
      

  11.   

    select * from 
         ( 由高到低排序查询)  where rownum<=50
    如:
    select * from 
         ( 
           select rownum ,a.dhhm dhhm,c.khmc khmc,a.zxfjf-nvl(b.ydxfjf,0) dqxfjf,a.zzwjf-nvl(b.ydzwjf,0) dqzwjf,a.zjljf-nvl(b.ydjljf,0) dqjljf 
           ,a.zxfjf-nvl(b.ydxfjf,0)+a.zzwjf-nvl(b.ydzwjf,0)+a.zjljf-nvl(b.ydjljf,0)+nvl(b.ljjzjf,0) zjf,nvl(b.ljdf,0) ljdf,nvl(b.ljjzjf,0) ljjzjf from 
    (select dhhm,sum(xfjf) zxfjf,sum(zwjf) zzwjf,sum(jljf) zjlj from          yx_jfdab group by dhhm)A,
    (select dhhm,ydxfjf,ydzwjf,ydjljf,ljdf,ljjzjf from yx_jfdjljb)B,
    (select dhhm,khmc,blzd8 from jfxt.yx_yhdab)C
    where a.dhhm=b.dhhm(+) and a.zxfjf-nvl(b.ydxfjf,0)+a.zzwjf-nvl(b.ydzwjf,0)+a.zjljf-nvl(b.ydjljf,0)+nvl(b.ljjzjf,0)>500
    and a.dhhm=c.dhhm order by zjf desc   )where rownum<=50
      

  12.   

    这样做行吗,我在PB和SQLPLUS都调试不过,而且效率很低啊,我可是有50万条记录啊,中间还要运算
      

  13.   

    select * from 
         ( 由高到低排序查询)  where rownum<=50这样做是正确的!
      

  14.   

    select * from (select rownum ,a.dhhm dhhm,c.khmc khmc,a.zxfjf-nvl(b.ydxfjf,0) dqxfjf,a.zzwjf-nvl(b.ydzwjf,0) dqzwjf,a.zjljf-nvl(b.ydjljf,0) dqjljf 
           ,a.zxfjf-nvl(b.ydxfjf,0)+a.zzwjf-nvl(b.ydzwjf,0)+a.zjljf-nvl(b.ydjljf,0)+nvl(b.ljjzjf,0) zjf,nvl(b.ljdf,0) ljdf,nvl(b.ljjzjf,0) ljjzjf from 
    (select dhhm,sum(xfjf) zxfjf,sum(zwjf) zzwjf,sum(jljf) zjlj,rownum rown from          yx_jfdab group by dhhm)A,
    (select dhhm,ydxfjf,ydzwjf,ydjljf,ljdf,ljjzjf from yx_jfdjljb)B,
    (select dhhm,khmc,blzd8 from jfxt.yx_yhdab)C
    where a.dhhm=b.dhhm(+) and a.zxfjf-nvl(b.ydxfjf,0)+a.zzwjf-nvl(b.ydzwjf,0)+a.zjljf-nvl(b.ydjljf,0)+nvl(b.ljjzjf,0)>500
    and a.dhhm=c.dhhm order by zjf desc) a where a.rown <50
      

  15.   

    select * from table1 b
    from (select * from table1 a where a.num > 500 order by a.num) tt
    where rownum < 50
    你要把你的查询结果排序后包起来重新查询一次
      

  16.   

    怎么没人问答啊,调试不过
    我用的是ORACLE数据库
      

  17.   

    为什么不做一个视图呢?
    select * from 视图 where rownum<=50
      

  18.   

    wo  cai liao yi ge up yi xia ba !
      

  19.   

    select * from (条件) where rownum<=50 order by zjf desc
    我用过,可以的(oracle)
      

  20.   

    mynamedragon(我希望是黑龙) 兄弟,我想你的结果不是先排序再取前50,而是先取前50再排序吧,你不信,试试看
      

  21.   

    select * from tablename where rownum<=50 and zjf>500 order by zjf desc
      

  22.   

    rownum只是oracle在表空间中存放的顺序,你用rownum<50 取出来的只是存储在前50的记录,而非查询出来前50的记录