有三个表A,B,C表A
    AID TEST
  T1 A1
  T2 A2
  T2 A3
  T2 A4表B
    BID A1 A2 A3 A4 A5 A6
1 S1 W1 L1 H1 X1 Z1
2 S2 W2 L2 H2 X2 Z2
3 S3 W3 L3 H3 X3 Z3
4 S4 W4 L4 H4 X4 Z4
5 S5 W5 L5 H5 X5 Z5
6 S6 W6 L6 H6 X6 Z6表C
    CID SEQ VALUE
  2 1 S1
  3 1 W2
  3 2 L2
  3 3 H2
首先根据条件T1,T2查询A表分别取得值
A1 与A2 A3 A4
再根据这两组值分别查询B表得到六组
S1 S2 S3 S4 S5 S6
与六组
W1 L1 H1
W2 L2 H2
W3 L3 H3
W4 L4 H4
W5 L5 H5
W6 L6 H6
在分别根据查到的值判断C表中是否包含如果包含不操作,不包含在C表中查找CID最大值并插入上面的值CID+1
此例中C表中包含了S1的和W2 L2 H2的数值所以应该插入
 4 1 S2,
 5 1 S3,
 6 1 S4,
 7 1 S5,
 8 1 S6与
 9 1 W1 
 9 2 L1 
 9 3 H1   
10 1 W3 
10 2 L3 
10 3 H3
11 1 W4 
11 2 L4 
11 3 H4         
12 1 W5 
12 2 L5 
12 3 H5        
......
需要注意的是A表里面的值是变动的,所以查询出A表的值作为列查询B表也是不固定的。

解决方案 »

  1.   

    给个示例给楼主  本质差不多/*物料 需要数量 需要仓库 现存量仓库 现存量仓库数量 批次 
    A1 2 C1 C1         20         123 
    A1 2 C1 C2         30         111 
    A1 2 C1 C2         20         222 
    A1 2 C1 C3         10         211 
    A2 3 C4 C1         40         321 
    A2 3 C4 C4         50         222 
    A2 3 C4 C4         60         333 
    A2 3 C4 C5         70         223 
    我需要把上面的查询结果转换为下面的。
    物料 需要数量 需要仓库 C1 C2 C3 C4 C5 
    A1 2 C1 20 50 10 0 0 
    A2 3 C4 40 0 0 110 70 
    */ 
    ------------建表
    CREATE TABLE TEST
    (
    WL VARCHAR2(10),
    XYSL INTEGER,
    XYCK VARCHAR2(10),
    XCLCK VARCHAR2(10),
    XCLCKSL INTEGER,
    PC INTEGER
    );
    ------------ 第一部分测试数据
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C1' ,        20,         123); 
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C2' ,        30,         111); 
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C2' ,        20,         222); 
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C3' ,        10,         211); 
    INSERT INTO TEST VALUES('A2', 3, 'C4', 'C1' ,        40,         321); 
    INSERT INTO TEST VALUES('A2', 3, 'C4', 'C4' ,        50,         222); 
    INSERT INTO TEST VALUES('A2', 3, 'C4', 'C4' ,        60,         333); 
    INSERT INTO TEST VALUES('A2', 3, 'C4', 'C5' ,        70,         223);
    COMMIT;
    --------------------  动态生成结果表
    DECLARE
      V_SQL VARCHAR2(2000);
      CURSOR CURSOR_1 IS
        SELECT DISTINCT T.XCLCK
          FROM TEST T
         ORDER BY XCLCK; 
    BEGIN
      V_SQL := 'SELECT WL,XYSL,XYCK';  FOR V_XCLCK IN CURSOR_1
      LOOP
        V_SQL := V_SQL || ',' || 'SUM(DECODE(XCLCK,''' || V_XCLCK.XCLCK ||
                 ''',XCLCKSL,0)) AS ' || V_XCLCK.XCLCK;
      END LOOP;
      V_SQL := V_SQL || ' FROM TEST GROUP BY WL,XYSL,XYCK ORDER BY WL,XYSL,XYCK';
      --DBMS_OUTPUT.PUT_LINE(V_SQL);
        V_SQL := 'CREATE TABLE RESULT  AS '||  V_SQL;
        --DBMS_OUTPUT.PUT_LINE(V_SQL);
        EXECUTE IMMEDIATE V_SQL;
    END;
    --------------- 结果
    SELECT * FROM RESULT T;
    WL                                            XYSL XYCK               C1         C2         C3         C4         C5
    ---------- --------------------------------------- ---------- ---------- ---------- ---------- ---------- ----------
    A1                                               2 C1                 20         50         10          0          0
    A2                                               3 C4                 40          0          0        110         70
    --------------- 删除结果表
    DROP TABLE RESULT; 
    ------------ 第二部分测试数据
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C6' ,        20,         124); 
    INSERT INTO TEST VALUES('A2', 2, 'C1', 'C7' ,        30,         121); 
    INSERT INTO TEST VALUES('A3', 2, 'C1', 'C8' ,        20,         322); 
    COMMIT;---------  从新运行 动态生成结果表 语句块
    --------------- 结果
    SELECT * FROM RESULT T;
    WL     XYSL XYCK          C1       C2         C3         C4         C5         C6         C7         C8
    ----- ----- -------- ------- -------- ---------- ---------- ---------- ---------- ---------- ----------
    A1        2 C1            20       50         10          0          0         20          0          0
    A2        2 C1             0        0          0          0          0          0         30          0
    A2        3 C4            40        0          0        110         70          0          0          0
    A3        2 C1             0        0          0          0          0          0          0         20
    --------------- 删除结果表
    DROP TABLE RESULT; 
      

  2.   

    主要使用游标和merge语句,采用动态执行SQL方式运行,代码大致如下:
    for la in (select Test from A where AID in ('T1','T2'))
       v_sql:=' merge into C 
                 using (select '||la.test||' value from B 
                on (c.VALUE=B.value)
                when matched then 
                      update cid=cid+1
                when not matched then 
                      insert values(cid,value);';
       执行动态SQL;
    end loop;