WITH a AS 
     (SELECT 1 deptno, '部门一' deptname, '张三' NAME 
        FROM DUAL 
      UNION ALL 
      SELECT 1, '部门一', '李四' 
        FROM DUAL 
      UNION ALL 
      SELECT 1, '部门一', '王五' 
        FROM DUAL 
      UNION ALL 
      SELECT 2, '部门二', '赵六' 
        FROM DUAL 
      UNION ALL 
      SELECT 2, '部门二', '刘七' 
        FROM DUAL) 
SELECT DECODE (ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY deptname,
                NAME),
               1, deptno,
               NULL
              ) deptno,
       DECODE
          (ROW_NUMBER () OVER (PARTITION BY deptno, deptname ORDER BY NAME),
           1, deptname,
           NULL
          ) deptname,
       NAME
  FROM a       
        

解决方案 »

  1.   

    WITH a AS  
         (SELECT 1 deptno, '部门一' deptname, '张三' NAME  
            FROM DUAL  
          UNION ALL  
          SELECT 1, '部门一', '李四'  
            FROM DUAL  
          UNION ALL  
          SELECT 1, '部门一', '王五'  
            FROM DUAL  
          UNION ALL  
          SELECT 2, '部门二', '赵六'  
            FROM DUAL  
          UNION ALL  
          SELECT 2, '部门二', '刘七'  
            FROM DUAL)  
    這個就相當於建表語句,並插入數據,也就是個臨時表吧
    SELECT DECODE (ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY deptname, 
                    NAME), 
                   1, deptno, 
                   NULL 
                  ) deptno, 
           DECODE 
              (ROW_NUMBER () OVER (PARTITION BY deptno, deptname ORDER BY NAME), 
               1, deptname, 
               NULL 
              ) deptname, 
           NAME 
      FROM a    
    這一部分就是用了分析函數分組查詢了
      

  2.   

    哈哈,居然真是我写的
    http://topic.csdn.net/u/20080521/12/16a9ea13-8160-4ef0-b7ed-be2e98f8c6ea.html
      

  3.   

    子查询的方式。WITH 看作要操作的表就可以了。
      

  4.   

    分两部分
    首先:WITH a AS  
         (SELECT 1 deptno, '部门一' deptname, '张三' NAME  
            FROM DUAL  
          UNION ALL  
          SELECT 1, '部门一', '李四'  
            FROM DUAL  
          UNION ALL  
          SELECT 1, '部门一', '王五'  
            FROM DUAL  
          UNION ALL  
          SELECT 2, '部门二', '赵六'  
            FROM DUAL  
          UNION ALL  
          SELECT 2, '部门二', '刘七'  
            FROM DUAL) 
    以上将你查出的信息放到a中,a可以理解一个结果集
    以后的语句是在a结果集中查出你所需要的数据,避免使用了临时表
      

  5.   

    我就解释语句里的思路吧,with都被上面的解释光了
    SELECT DECODE (ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY deptname,  
                    NAME),  
                   1, deptno,  
                   NULL  
                  ) deptno,  
           DECODE  
              (ROW_NUMBER () OVER (PARTITION BY deptno, deptname ORDER BY NAME),  
               1, deptname,  
               NULL  
              ) deptname,  
           NAME  
      FROM a    
    原贴数据
    deptno, deptname, name,  
    1        部门一     张三 
    1        部门一     李四 
    1        部门一     王五 
    2        部门二     赵六 
    2        部门二     刘七 用ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY deptname,  
                    NAME),  和ROW_NUMBER () OVER (PARTITION BY deptno, deptname ORDER BY NAME)相当于再生成两列
    deptno, deptname, name,  编号1,编号2
    1        部门一     张三    1     1
    1        部门一     李四    2     2
    1        部门一     王五    3     3
    2        部门二     赵六    1     1
    2        部门二     刘七    2     2
    之所以编号二和编号一相同,是因他这里的数据同一deptno的没有不同deptname
    也就是说没有以下这种情况,如果有的话,两个编号就不同了
    deptno, deptname, name,  编号1,编号2
    1        部门一     张三    1     1
    1        部门一     李四    2     2
    1        部门一     王五    3     3
    1        部门二     赵六    4     1
    1        部门二     刘七    5     2
    然后用decode 一行行判断
    如果编号1=1,输出显示deptno
    不等于1的话,输出null
    第二个DECODE,同理,只不过是输出deptname
      

  6.   

    不好意思,这段SQL确实是在CSDN上看到了,呵呵。不过还是谢谢你的解释啊