在另一行插入基于最大值的值大于值

问题描述:

在标题中很难很好地解释问题。在另一行插入基于最大值的值大于值

我从一行插入6个值(或基于值)。 我还需要从第二行中插入一个值,其中:

  1. 在一列(ID)的值必须在主源行柱(CODE)必须等于
  2. 的值( 100,200),而另一行的值必须为300或400
  3. 辅助行中另一列(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 

所以要提供一个例子.. 在我的第二个表我想插入OBJIDOBJID2CODEENTRY_TIMEsubstr(INFO(...))IDUSER

即从我的示例中插入第二个表中的行将如下所示:

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

比这里给你一个更好的解决方案,我建议你创建一个视图,在那里把你的逻辑的一切,得到预期的输出你想要的方式。然后执行插入语句作为从这个新视图中选择。 – g00dy

+0

你能为我们完成输出表吗?请给我们所有的行。根据当前的规范很难理解你想要什么。 –

+0

@FlorinGhita 如果我可以完成输出表,那么我就不需要首先提出这个问题。从我在第一个表中给出的示例行中,第二个表中只有一个可能的完整行。 – Slingy

你可以试试这个:

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上面的查询;