比如有一个表结构如下:
Column Name ID Pk Null? Data Type Default Histogram
ROLEID 1 2 N NUMBER (4) No
MODULEID 2 1 N NUMBER (9) No
PRIVRSVD 3 Y VARCHAR2 (10 Byte) No表中的数据如下:
ROLEID MODULEID PRIVRSVD1 3
1 5
1 13
3 5
3 18
3 19
3 67
2 18
2 19
2 20
2 28
2 29
4 36
4 48
6 5
6 6
5 28
10 91
12 8
12 64
12 66
12 18
4 35
12 7
12 20 我想选出这样的结果
1 3
2 18
3 5
4 36
6 5
10 91
12 7
不知道怎么写啊?
还有我希望在查询的过程中能够观察子查询的结果有没有办法?看到子查询的结果更有助于别写整个表达式啊?

解决方案 »

  1.   

    select ROLEID,min(MODULEID) from tb group by ROLEID;
      

  2.   

    没说清楚需求
    是取每个ROLEID 的最小MODULEID 吗
    select roleid,min(moduleid) from tablename group by roleid;要同时显示子查询的结果,那你想要2个结果如何显示?
    要比较的话可以分开进行两次查询(总的查询和只运行子查询),来比较结果
      

  3.   

    我写了一个嵌套查询如下:
    /* Formatted on 2009-11-18 下午 04:10:09 (QP5 v5.115.810.9015) */
      SELECT   a.*
        FROM   MNGROLEPRIVILTB a
       WHERE not  EXISTS (SELECT   roleid
                         FROM   MNGROLEPRIVILTB
                        WHERE   a.roleid > roleid AND a.moduleid = moduleid)
    ORDER BY   a.roleid但查询结果和我预期的大不相同,所以我希望能够看到子查询的查询结果,进而找出错误。
    这个查询就是要找出给个分组中最小的记录。
      

  4.   


    这个语句查询的结果是相同moduleid中最小的roleid 
    好像和你的需求相反
    你改成
      SELECT  a.* 
        FROM  MNGROLEPRIVILTB a 
      WHERE not  EXISTS (SELECT  1 
                        FROM  MNGROLEPRIVILTB 
                        WHERE  a.moduleid > moduleid AND a.roleid = roleid ) 
    ORDER BY  a.roleid 
      

  5.   

    你可以这样看结果
     SELECT  a.*,
          case when not  EXISTS (SELECT  roleid 
                        FROM  MNGROLEPRIVILTB 
                        WHERE  a.roleid > roleid AND a.moduleid = moduleid) then 1
               else 2 end
        FROM  MNGROLEPRIVILTB a ORDER BY  a.roleid 标为1的就是满足你先前where条件的记录
      

  6.   


    我的查询结果很怪异: ROLEID   MODULEID PRIVRSVD  
    ---------- ---------- ----------
             1          3           
             1          5           
             1          6           
             1          7           
             1          8           
             1          9           
             1         10           
             1         11           
             1         12           
             1         13           
             1         14           
             1         15           
             1         16           
             1         18           
             1         19           
             1         20           
             1         21           
             1         22           
             1         23           
             1         24           
             1         25               ROLEID   MODULEID PRIVRSVD  
    ---------- ---------- ----------
             1         26           
             1         27           
             1         28           
             1         29           
             1         31           
             1         32           
             1         33           
             1         35           
             1         36           
             1         37           
             1         38           
             1         39           
             1         68           
             1         40           
             1         41           
             1         42           
             1         43           
             1         44           
             1         45           
             1         46           
             1         47               ROLEID   MODULEID PRIVRSVD  
    ---------- ---------- ----------
             1          2           
             1          1           
             1         90           
             1         83           
             1         82           
             1         81           
             1         80           
             1         79           
             1         78           
             1         77           
             1         76           
             1         75           
             1         74           
             1         73           
             1         72           
             1         71           
             1         70           
             1         48           
             1         50           
             1         51           
             1         52               ROLEID   MODULEID PRIVRSVD  
    ---------- ---------- ----------
             1         53           
             1         54           
             1         55           
             1         56           
             1         57           
             1         58           
             1         59           
             1         60           
             1         61           
             1         62           
             1         63           
             1         64           
             1         65           
             1         66           
             1         67           
            10         91           79 rows selected.
      

  7.   

    分组分错了,你按MODULEID分组,每个MODULEID中取最小的ROLEID。因为MODULEID为91时,最小的roleid为10.上面的moduleid最小的roleid都为1.
    我在5楼说过了,你可以参照改一下
      

  8.   

    高手所说的分组是什么啊?不太了解啊,只知道group by 是进行分组的。难道是where查询条件分组?能具体数一下吗?
      

  9.   

    我说的不是语法上的分组,是逻辑上的分组
    你理解一下那个语句就知道了
    not  EXISTS (SELECT  1 
                        FROM  MNGROLEPRIVILTB 
                        WHERE  a.moduleid > moduleid AND a.roleid = roleid )
    验证记录的存在性:MNGROLEPRIVILTB 表和a表roleid 相同,且moduleid小于a表中moduleid时,是否存在这么一个记录
    如果不存在,返回这条记录