基于min值大于另一行中的值插入值

时间:2017-07-10 05:18:30

标签: oracle plsql insert alias

很难在标题中很好地解释这个问题。

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

  1. 一列(ID)中的值必须相等
  2. 主要来源行中的列(CODE)中的值必须为IN(100,200),而另一行的值必须为300或400
  3. 辅助行中另一列(OBJID)中的值必须高于主行中的值。
  4. 源表如下:

    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 < / 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万行。

2 个答案:

答案 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)中使用代码;