让一条SQL弄得头脑发昏
--------------------------------------------
有三个表:
表1:
*第一分类code
 第一分类name
表2:
*第一分类code
*第二分类code
 第二分类name
表3:
*第一分类code
*第二分类code
*第三分类code
 第三分类name
 选项个数
--------------------------------------------
*为主件
逻辑很简单,三个表关联,取“选项个数=0”的部分。
麻烦出来了,以第三分类code进行排序(升序),需要取一个count,这个count是排序后“选项个数=0”的这条记录的位置。也就是说,count是在未排除“选项个数=0”之前的位置。
假如数据类似:第一分类code    第二分类code    第三分类code   选项个数
XXX1            YYY1            ZZZ1           1
XXX2            YYY2            ZZZ2           2
XXX3            YYY3            ZZZ3           3
XXX4            YYY4            ZZZ4           0
TTT1            MMM1            NNN1           1
TTT2            MMM2            NNN2           2
TTT3            MMM3            NNN3           3
TTT4            MMM4            NNN4           0
------------------------------------------------------------
要取得的数据结果为:XXX4            YYY4            ZZZ4           4
TTT4            MMM4            NNN4           8
问题就是这个4,8上了。如何写SQL呢?或者直接有Oracle的函数可以取得位置?
非常着急,搞定立即结贴。
 

解决方案 »

  1.   

    select h.* from (select c.*,rownum r from 表3 c) h where 选项个数=0
      

  2.   

    select h.* from (select c.*,rownum r from 表3 c) h 
    where 选项个数=0 order by 第三分类code
      

  3.   

    create table e_1
    (
    onecode varchar2(20)
    );create table e_2
    (
    onecode varchar2(20),
    twocode varchar2(20)
    );create table e_3
    (
    onecode varchar2(20),
    twocode varchar2(20),
    threecode varchar2(20),
    item number
    );drop table e_3insert into e_1 values('xxx1');insert into e_1 values('xxx2');insert into e_1 values('xxx3');insert into e_1 values('xxx4');insert into e_1 values('ttt1');insert into e_1 values('ttt2');insert into e_1 values('ttt3');insert into e_1 values('ttt4');insert into e_2 values('xxx1', 'yyy1');insert into e_2 values('xxx2', 'yyy2');insert into e_2 values('xxx3', 'yyy3');insert into e_2 values('xxx4', 'yyy4');insert into e_2 values('ttt1', 'mmm1');insert into e_2 values('ttt2', 'mmm2');insert into e_2 values('ttt3', 'mmm3');insert into e_2 values('ttt4', 'mmm4');insert into e_3 values('xxx1', 'yyy1', 'zzz1', 1);insert into e_3 values('xxx2', 'yyy2', 'zzz2', 2);insert into e_3 values('xxx3', 'yyy3', 'zzz3', 3);insert into e_3 values('xxx4', 'yyy4', 'zzz4', 0);insert into e_3 values('ttt1', 'mmm1', 'nnn1', 1);insert into e_3 values('ttt2', 'mmm2', 'nnn2', 2);insert into e_3 values('ttt3', 'mmm3', 'nnn3', 3);insert into e_3 values('ttt4', 'mmm4', 'nnn4', 0);SQL> select onecode, twocode, threecode, item, id "位置"
      2  from (
      3  select t1.onecode, t2.twocode, t3.threecode, t3.item, rownum id
      4  from e_1 t1, e_2 t2, e_3 t3
      5  where t1.onecode = t2.onecode and t2.twocode = t3.twocode )
      6  where item = 0
      7  /ONECODE              TWOCODE              THREECODE                 ITEM      位置
    -------------------- -------------------- -------------------- --------- ---------
    ttt4                 mmm4                 nnn4                         0         4
    xxx4                 yyy4                 zzz4                         0         8SQL>
      

  4.   

    如果是楼主的就这样。
    select 第一分类code, 第二分类code, 第三分类code, 选项个数, rownum 位置
    from (
    select t1.第一分类code, t2.第二分类code, t3.第三分类code, t3.选项个数
    from t1, t2, t3
    where t1.第一分类code = t2.第一分类code and t2.第二分类code = t3.第二分类code )
    where 选项个数 = 0
      

  5.   

    TO:allright_flash() 
    select h.* from (select c.*,rownum r from 表3 c) h 
    where 选项个数=0 order by 第三分类code
    这样会把所有数据全部取出,我需要把关联的取出,而关联后无法排序,这样rownum就错乱了。TO:Eric_1999(╙@^@╜) 
    select 第一分类code, 第二分类code, 第三分类code, 选项个数, rownum 位置
    from (
    select t1.第一分类code, t2.第二分类code, t3.第三分类code, t3.选项个数
    from t1, t2, t3
    where t1.第一分类code = t2.第一分类code and t2.第二分类code = t3.第二分类code )
    where 选项个数 = 0
    你这样是取得关联数据后再取得rownum,这样就错了。
    -------------------------------------------------------------------------------
    不是所有数据的位置,也不是选项个数 = 0时的位置,而是关联后数据的位置,最后取得选项个数 = 0那部分数据。
    不知道有没有可能通过SEQUENCE方法实现.