一道考试题目,我写的太麻烦了,有没有好的优化方法?
A表有ID,A1,A2。。。。A36,B1,B2,B16 字段。
B表有ID,A1,A2,A3,A4,A5,A6,B1字段
条件:A表A1。。A36中有6个字段有数据,B1至B16中有一个字段有数据。
要求:把A表中的字段不为空的数值放入B表中,B表中的A1至A6放A表中的A1至A36中的6个字段不为空的值,B表中的B1放A表中的B1至B16中的不为空的一个字段的值
实际上这是一个36选7的题目
有兴趣的可以写一下:
方法不限
我想用数组,但不知道怎么把A表中的数据放入到数组中
------解决方案--------------------彩票?是不是我的理解能力有问题?
:把A表中的字段不为空的数值放入B表中,B表中的A1至A6放A表中的A1至A36中的6个字段不为空的值,B表中的B1放A表中的B1至B16中的不为空的一个字段的值
------解决方案--------------------这样不知道是否简单些!
INSERT INTO B(A1,A2,A3,A4,A5,A6)
SELECT DISTINCT
ID,MAX(DECODE(NUM,1,A1)) OVER(PARTITION BY ID),
MAX(DECODE(NUM,2,A1)) OVER(PARTITION BY ID),
MAX(DECODE(NUM,3,A1)) OVER(PARTITION BY ID),
MAX(DECODE(NUM,4,A1)) OVER(PARTITION BY ID),
MAX(DECODE(NUM,5,A1)) OVER(PARTITION BY ID),
MAX(DECODE(NUM,6,A1)) OVER(PARTITION BY ID)
FROM(
SELECT ID,A1,ROW_NUMBER() OVER(PARTITION BY ID,ORDER BY A1) NUM,
FROM(
SELECT ID,A1 FROM A WHERE A1 IS NULL
UNION ALL
SELECT ID,A2 FROM A WHERE A2 IS NULL
.........
UNION
SELECT ID,A36 FROM A WHERE A36 IS NULL
))
B同理,等待更好的解决方案
------解决方案--------------------楼上的的方法应该可行,但是如果数据到10000的话速度就慢了.
个人觉得用FUNCTION,数组单条执行比较好.
对于B有个更好的办法:
SELECT B1||B2||B3||B4||B5||B6||B7||B8||B9||B10||B11||B12||B13||B14||B15||B16
FROM A
因为B1~B16只有一个有值.
同样等待更好的解决方案