两个表A ,B
 表A的数据;列0    列1 列2 列3  列4 列5 列6 列7
JOBID  001 002 003  a1  a1  a3  10001
JOBID  002 002 003  F1  F2  F3  10001
JOBID  003 002 003  D1  D2  D3  10001
JOBID  004 002 003  W   Y   Z   10002
JOBID  005 002 003  O   P   Q   10002
JOBID  006 002 003  R   S   T   10002
JOBID  007 002 003  m1  m2  m3  10003
JOBID  008 002 003  m4  m5  m6  10003
JOBID  009 002 003  y   x   z   10003
JOBID  010 002 003..............1000N将表A的数据检索出来放到表B中 变成下面的表B记录形式 (A表的每3条记录组成一条记录存放到B表中 )表B的数据;
    列0 列2 列3  列4 列5 列6 列7 列8 列9 列10 列11 列12
  JOBID 002 003  a1  a1  a3  F1  F2  F3  D1   D2   D3
  JOBID 002 003  W   Y    Z  O   P   Q   R    S    T
  JOBID 002 003  m1  m2  m3  m4  m5  m6  y    x    z
  JOBID 002 003  ...........已知的条件
    
    A表的每3条记录 列7 值是相同的
    A表 列0 是主键
    

     如何写SQL 在Procedure 实现上面的功能  最后求求各位大哥了!
    小弟实在是不会写了 明天工作急用  晚上下班我就结贴 先谢谢了

解决方案 »

  1.   

    两个表A ,B 
    表A的数据; 列0    列1 列2 列3  列4 列5 列6 列7 
    JOBID  001 002 003  a1  a1  a3  10001 
    JOBID  002 002 003  F1  F2  F3  10001 
    JOBID  003 002 003  D1  D2  D3  10001 
    JOBID  004 002 003  W  Y  Z  10002 
    JOBID  005 002 003  O  P  Q  10002 
    JOBID  006 002 003  R  S  T  10002 
    JOBID  007 002 003  m1  m2  m3  10003 
    JOBID  008 002 003  m4  m5  m6  10003 
    JOBID  009 002 003  y  x  z  10003 
    JOBID  010 002 003..............1000N 将表A的数据检索出来放到表B中 变成下面的表B记录形式 (A表的每3条记录组成一条记录存放到B表中 ) 表B的数据; 
        列0 列2 列3  列4 列5 列6 列7 列8 列9 列10 列11 列12 
      JOBID 002 003  a1  a1  a3  F1  F2  F3  D1  D2  D3 
      JOBID 002 003  W  Y    Z  O  P  Q  R    S    T 
      JOBID 002 003  m1  m2  m3  m4  m5  m6  y    x    z 
      JOBID 002 003  ........... 已知的条件 
        
        A表的每3条记录 列7 值是相同的 
        A表 列0 是主键 
        
    求 
        如何写SQL 在Procedure 实现上面的功能  最后求求各位大哥了! 
        小弟实在是不会写了 明天工作急用  晚上下班我就结贴 先谢谢了
      

  2.   

    select t1.col_0,t1.col_2,t1.col_3, t1.col_4,t1.col_5,t1.col_6,t2.col_4,t2.col_5,t2.col_6 
    ,t3.col_4,t3.col_5,t3.col_6
    from table t1,table t2,table t3 where t1.col_7 = t2.col_7 and t1.col_7 = t3.col_7 and t1.col_1<t2.col_1 and t2.col_1<t3.col_1
    试试可不可以
       
      

  3.   

    SQL> SELECT * FROM A;COL_0      COL_1      COL_2      COL_3      COL_4      COL_5      COL_6      COL_7
    ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
    JOBID      001        002        003        a1         a2         a3         10001
    JOBID      002        002        003        F1         F2         F3         10001
    JOBID      003        002        003        D1         D2         D3         10001
    JOBID      004        002        003        W          Y          Z          10002
    JOBID      005        002        003        O           P         Q          10002
    JOBID      006        002        003        R          S          T          10002
    JOBID      007        002        003        m1         m2         m3         10003
    JOBID      008        002        003        m4         m5         m6         10003
    JOBID      009        002        003        y          x          z          10003
    JOBID      010        002        003        p          d          q          1000410 rows selectedSQL> 
    SQL> SELECT COL_0, COL_2, COL_3, 例4, 例5, 例6, 例7, 例8, 例9, 例10, 例11, 例12
      2    FROM (SELECT COL_0,
      3                 COL_2,
      4                 COL_3,
      5                 MAX(DECODE(RN, 1, COL_4, NULL)) 例4,
      6                 MAX(DECODE(RN, 1, COL_5, NULL)) 例5,
      7                 MAX(DECODE(RN, 1, COL_6, NULL)) 例6,
      8                 MAX(DECODE(RN, 2, COL_4, NULL)) 例7,
      9                 MAX(DECODE(RN, 2, COL_5, NULL)) 例8,
     10                 MAX(DECODE(RN, 2, COL_6, NULL)) 例9,
     11                 MAX(DECODE(RN, 3, COL_4, NULL)) 例10,
     12                 MAX(DECODE(RN, 3, COL_5, NULL)) 例11,
     13                 MAX(DECODE(RN, 3, COL_6, NULL)) 例12,
     14                 COL_7
     15            FROM (SELECT A.*,
     16                         ROW_NUMBER() OVER(PARTITION BY COL_7 ORDER BY COL_1) RN
     17                    FROM A)
     18           GROUP BY COL_0, COL_2, COL_3, COL_7
     19           ORDER BY COL_7)
     20  ;COL_0      COL_2      COL_3      例4        例5        例6        例7        例8        例9        例10       例11       例12
    ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
    JOBID      002        003        a1         a2         a3         F1         F2         F3         D1         D2         D3
    JOBID      002        003        W          Y          Z          O           P         Q          R          S          T
    JOBID      002        003        m1         m2         m3         m4         m5         m6         y          x          z
    JOBID      002        003        p          d          q                                                                 SQL> 
      

  4.   

    scott@ORA1> select *
      2    from a;    JOB_ID C1    C2    C3    C4    C5    C6    C7
    ---------- ----- ----- ----- ----- ----- ----- -----
             1 001   002   003   a1    a1    a3    10001
             2 002   002   003   F1    F2    F3    10001
             3 003   002   003   D1    D2    D3    10001
             4 004   002   003   W     Y     Z     10002
             5 005   002   003   O     P     Q     10002
             6 006   002   003   R     S     T     10002
             7 007   002   003   m1    Y     Z     10003
             8 008   002   003   m2    Y     Z     10003
             9 009   002   003   y     x     Z     10003已选择9行。scott@ORA1> 
    scott@ORA1> select rownum job_id
      2        ,x.*
      3    from (
      4          select
      5                 max(c2) c2
      6                ,max(c3) c3
      7                ,max(decode(rn, 1, c4)) c4
      8                ,max(decode(rn, 1, c5)) c5
      9                ,max(decode(rn, 1, c6)) c6
     10                ,max(decode(rn, 2, c4)) c7
     11                ,max(decode(rn, 2, c5)) c8
     12                ,max(decode(rn, 2, c6)) c9
     13                ,max(decode(rn, 3, c4)) c10
     14                ,max(decode(rn, 3, c5)) c11
     15                ,max(decode(rn, 3, c6)) c12
     16            from
     17                  (
     18                  select a.*,
     19                         row_number() over(partition by c7 order by c1) rn
     20                    from A
     21                   ) x
     22            group by c7
     23         ) x
     24  ;    JOB_ID C2    C3    C4    C5    C6    C7    C8    C9    C10   C11   C12
    ---------- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
             1 002   003   a1    a1    a3    F1    F2    F3    D1    D2    D3
             2 002   003   W     Y     Z     O     P     Q     R     S     T
             3 002   003   m1    Y     Z     m2    Y     Z     y     x     Z
      

  5.   

    这是表和数据
    create table A
    (
     job_id number
    ,c1 varchar2(50)
    ,c2 varchar2(50)
    ,c3 varchar2(50)
    ,c4 varchar2(50)
    ,c5 varchar2(50)
    ,c6 varchar2(50)
    ,c7 varchar2(50)
    );insert into A values(1, '001', '002', '003', 'a1', 'a1', 'a3', '10001');
    insert into A values(2, '002', '002', '003', 'F1', 'F2', 'F3', '10001');
    insert into A values(3, '003', '002', '003', 'D1', 'D2', 'D3', '10001');
    insert into A values(4, '004', '002', '003', 'W', 'Y', 'Z', '10002');
    insert into A values(5, '005', '002', '003', 'O', 'P', 'Q', '10002');
    insert into A values(6, '006', '002', '003', 'R', 'S', 'T', '10002');
    insert into A values(7, '007', '002', '003', 'm1', 'Y', 'Z', '10003');
    insert into A values(8, '008', '002', '003', 'm2', 'Y', 'Z', '10003');
    insert into A values(9, '009', '002', '003', 'y', 'x', 'Z', '10003');
    commit;
      

  6.   

    4楼,5楼
    是oracle版牛人!
      

  7.   

    这个方法太秒了·SQL高手!赞一个。
      

  8.   

    本人觉得还是huangdh12 方法比较就简单。
    INSERT INTO B
    SELECT E.NO0,E.NO2,E.NO3,E.NO4,E.NO5,E.NO6,D.NO4,D.NO5,D.NO6,C.NO4,C.NO5,C.NO6 FROM 
    A C,A D,A E
    WHERE C.NO7=D.NO7 AND D.NO7=E.NO7 AND C.NO1>D.NO1 AND D.NO1>E.NO1
    但是你这个题目有点奇怪,A表 列0 是主键 
    然后又写的是JOBID,也就是这个不应该一样才对啊
    如果是这样的话,楼上的SQL语句就有问题了。
      

  9.   

    如果是ROWID不一样的话,还是五楼的比较好。三楼虽然简单,但是执行计划不是很好。四楼如果ROW_ID不一样的话就有问题。
      

  10.   

    [color=#FF0000] MAX(DECODE(RN, 1, COL_4, NULL)) 例4,
      6                 MAX(DECODE(RN, 1, COL_5, NULL)) 例5,
      7                 MAX(DECODE(RN, 1, COL_6, NULL)) 例6,
      8                 MAX(DECODE(RN, 2, COL_4, NULL)) 例7,
      9                 MAX(DECODE(RN, 2, COL_5, NULL)) 例8,
     10                 MAX(DECODE(RN, 2, COL_6, NULL)) 例9,
     11                 MAX(DECODE(RN, 3, COL_4, NULL)) 例10,
     12                 MAX(DECODE(RN, 3, COL_5, NULL)) 例11,
     13                 MAX(DECODE(RN, 3, COL_6, NULL)) 例12,
    [/color]如果不只是 12 列,要怎么写? 
      

  11.   

    五楼的写法是在四楼的基础上基于一种假设将"列2" "列3"从GROUP BY 列表中排除得到的简单写法,
    这个假设就是"列2" "列3"的值组合单独构成分组依据.
    从楼主提供的样本数据来看,这一假设是成立的.
    列0    列1 列2 列3  列4 列5 列6 列7 
    JOBID  001 002 003  a1  a1  a3  10001 
    JOBID  002 002 003  F1  F2  F3  10001 
    JOBID  003 002 003  D1  D2  D3  10001 
    JOBID  004 002 003  W  Y  Z  10002 
    JOBID  005 002 003  O  P  Q  10002 
    JOBID  006 002 003  R  S  T  10002 
    JOBID  007 002 003  m1  m2  m3  10003 
    JOBID  008 002 003  m4  m5  m6  10003 
    JOBID  009 002 003  y  x  z  10003 
    JOBID  010 002 003..............1000N 
    但如果样本数据扩展为
    列0    列1 列2 列3  列4 列5 列6 列7 
    JOBID  001 002 003  a1  a1  a3  10001 
    JOBID  002 002 003  F1  F2  F3  10001 
    JOBID  003 002 003  D1  D2  D3  10001 
    JOBID  004 002 003  W  Y  Z  10002 
    JOBID  005 002 003  O  P  Q  10002 
    JOBID  006 002 003  R  S  T  10002 
    JOBID  007 002 003  m1  m2  m3  10003 
    JOBID  008 002 003  m4  m5  m6  10003 
    JOBID  009 002 003  y  x  z  10003 
    JOBID  010 002 003..............1000N 
    JOBID  011 003 003  a1  a1  a3  10001 
    JOBID  012 003 003  F1  F2  F3  10001 
    JOBID  013 003 003  D1  D2  D3  10001 
    JOBID  014 003 003  W  Y  Z  10002 
    JOBID  015 003 003  O  P  Q  10002 
    JOBID  016 003 003  R  S  T  10002
    那么,这种写法显然是错误的. 
    四楼的写法是正确的,我这里提供另外一种版本的实现.其实没什么创意,仅仅是好奇.
    WITH TB AS
    (SELECT A.*,ROW_NUMBER() OVER(PARTITION BY COL_7 ORDER BY COL_1) RN FROM A)
    SELECT X.COL_0,X.COL_2,X.COL_3,X.COL_4,X.COL_5,X.COL_6,Y.COL_4,Y.COL_5,Y.COL_6,Z.COL_4,Z.COL_5,Z.COL_6,Z.COL_7 
    FROM TB X,TB Y,TB Z
    WHERE X.RN=1 AND Y.RN=2 AND Z.RN=3 
      AND X.COL_0=Y.COL_0 AND X.COL_2=Y.COL_2 AND X.COL_3=Y.COL_3
      AND X.COL_0=Z.COL_0 AND X.COL_2=Z.COL_2 AND X.COL_3=Z.COL_3
    从执行计划上来看,带GROUP BY的写法将会使用更多的临时表空间,而JOIN的写法让合并排序逻辑成为可能
      

  12.   

    纠正一下上面的写法:
    WITH TB AS 
    (SELECT A.*,ROW_NUMBER() OVER(PARTITION BY COL_7 ORDER BY COL_1) RN FROM A) 
    SELECT X.COL_0,X.COL_2,X.COL_3,X.COL_4,X.COL_5,X.COL_6,Y.COL_4,Y.COL_5,Y.COL_6,Z.COL_4,Z.COL_5,Z.COL_6,Z.COL_7 
    FROM TB X,TB Y,TB Z 
    WHERE X.RN=1 AND Y.RN=2 AND Z.RN=3 
      AND X.COL_0=Y.COL_0 AND X.COL_2=Y.COL_2 AND X.COL_3=Y.COL_3 AND X.COL_7=Y.COL_7  AND X.COL_0=Z.COL_0 AND X.COL_2=Z.COL_2 AND X.COL_3=Z.COL_3 AND X.COL_7=Z.COL_7