2017-07-10 111 views
1

在標題中很難很好地解釋問題。在另一行插入基於最大值的值大於值

我從一行插入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

回答

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

奇怪的別名,但不錯的解決方案! :) –

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