【问题标题】:Insert value based on min value greater than value in another row根据最小值插入值大于另一行中的值
【发布时间】:2017-07-10 05:18:30
【问题描述】:

标题中的问题很难解释清楚。

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

  1. 一列 (ID) 中的值必须相等
  2. 主源行中列 (CODE) 中的值必须为 IN (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 万行。

【问题讨论】:

  • 比在这里给你一个解决方案更好,我建议你创建一个视图,把你所有的逻辑放在哪里,并以你想要的方式获得预期的输出。然后从这个新视图中执行插入语句作为选择。
  • 您能帮我们完成输出表吗?请给我们所有的行。从当前的规范中很难理解你想要什么。
  • @FlorinGhita 如果我可以完成输出表,那么我首先不需要问这个问题。从我在第一个表中给出的示例行中,第二个表中只有一个可能的完整行。
  • @Slingy 我只需要你给的输入集。不是代码,而是测试数据。例如对于 objid = 4,对应的 objid2 是 5,不是吗?
  • @FlorinGhita 是的,实际上你是对的。我错过了。编辑了 OP。

标签: oracle plsql insert alias


【解决方案1】:

你可以试试这个:

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);

【讨论】:

  • 奇怪的别名,但很好的解决方案! :)
【解决方案2】:

好的,我想出了:

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)中的代码;

【讨论】:

    猜你喜欢
    • 2015-04-03
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 2021-07-25
    • 2021-12-31
    • 1970-01-01
    • 2020-12-03
    相关资源
    最近更新 更多