在另一行插入基于最大值的值大于值
问题描述:
在标题中很难很好地解释问题。在另一行插入基于最大值的值大于值
我从一行插入6个值(或基于值)。 我还需要从第二行中插入一个值,其中:
- 在一列(
ID
)的值必须在主源行柱(CODE
)必须等于 - 的值( 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
即从我的示例中插入第二个表中的行将如下所示:
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万行。
答
你可以试试这个:
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);
+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;
所以,你需要在where objid2 is not null
和代码(100,200)一insert select
上面的查询;
比这里给你一个更好的解决方案,我建议你创建一个视图,在那里把你的逻辑的一切,得到预期的输出你想要的方式。然后执行插入语句作为从这个新视图中选择。 – g00dy
你能为我们完成输出表吗?请给我们所有的行。根据当前的规范很难理解你想要什么。 –
@FlorinGhita 如果我可以完成输出表,那么我就不需要首先提出这个问题。从我在第一个表中给出的示例行中,第二个表中只有一个可能的完整行。 – Slingy