两个表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 实现上面的功能 最后求求各位大哥了!
小弟实在是不会写了 明天工作急用 晚上下班我就结贴 先谢谢了
表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 实现上面的功能 最后求求各位大哥了!
小弟实在是不会写了 明天工作急用 晚上下班我就结贴 先谢谢了
表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 实现上面的功能 最后求求各位大哥了!
小弟实在是不会写了 明天工作急用 晚上下班我就结贴 先谢谢了
,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
试试可不可以
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
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>
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
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;
是oracle版牛人!
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语句就有问题了。
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 列,要怎么写?
这个假设就是"列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的写法让合并排序逻辑成为可能
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