很难在标题中很好地解释这个问题。
我从一行插入6个值(或基于值)。 我还需要从第二行插入一个值:
ID
)中的值必须相等CODE
)中的值必须为IN(100,200),而另一行的值必须为300或400 OBJID
)中的值必须高于主行中的值。源表如下:
OBJID | CODE | ENTRY_TIME | INFO | ID | USER
---------------------------------------------
1 | 100 | x timestamp| .... | 10 | X
2 | 100 | y timestamp| .... | 11 | Y
3 | 300 | z timestamp| .... | 10 | F
4 | 100 | h timestamp| .... | 10 | X
5 | 300 | g timestamp| .... | 10 | G
所以提供一个例子..
在我的第二个表中,我想插入OBJID
,OBJID2
,CODE
,ENTRY_TIME
,substr(INFO(...))
,ID
,USER
< / p>
即。从我的例子中,插入第二个表的一行看起来像:
OBJID | OBJID2 | CODE | ENTRY_TIME | INFO | ID | USER
-----------------------------------------------------------
1 | 3 | 100 | x timestamp| substring | 10 | X
4 | 5 | 100 | h timestamp| substring2| 10 | X
我插入来自一行的所有内容都可以正常工作。
INSERT INTO TABLE2
(ID, OBJID, INFO, USER, ENTRY_TIME)
SELECT ID, OBJID, DECODE(CODE, 100, (SUBSTR(INFO, 12,
LENGTH(INFO)-27)),
600,'CREATE') INFO, USER, ENTRY_TIME
FROM TABLE1
WHERE CODE IN (100,200);
我知道我需要在TABLE1
上使用别名,但我不知道如何让其他人工作,特别是以有效的方式。现在有200万行,但是一旦我开始使用生产数据,就会有接近2000万行。
答案 0 :(得分:2)
你可以试试这个:
select primary.* ,
(select min(objid)
from table1 secondary
where primary.objid < secondary.objid
and secondary.code in (300,400)
and primary.id = secondary.id
) objid2
from table1 primary
where primary.code in (100,200);
答案 1 :(得分:0)
好的,我想出来了:
select OBJID,
min(case when code in (300,400) then objid end)
over (partition by id order by objid
range between 1 following and unbounded following
) objid2,
CODE, ENTRY_TIME, INFO, ID, USER1
from table1;
因此,您需要使用insert select
进行where objid2 is not null
上述查询,并在(100,200)中使用代码;