2016-12-09 11 views
0

考慮下面的Oracle數據庫表:如何在Oracle表中的列中移動值?

 
group revision comment 
1  1   1    
1  2   2 
1  null  null 
2  1   1    
2  2   2 
2  3   3 
2  4   4 
2  null  null 
3  1   1    
3  2   2 
3  3   3 
3  null  null 

我要評論欄就該一步向下調節,版本,其組內,使我得到如下表:

 
group revision comment 
1  1   null    
1  2   1 
1  null  2 
2  1   null    
2  2   1 
2  3   2 
2  4   3 
2  null  4 
3  1   null    
3  2   1 
3  3   2 
3  null  3 

我有以下查詢:

    

    MERGE INTO example_table t1 
    USING example_table t2 
    ON (
     (t1.revision = t2.revision+1 OR 
     (t2.revision = (
      SELECT MAX(t3.revision) 
      FROM example_table t3 
      WHERE t3.group = t1.group 
     ) AND t1.revision IS NULL) 
    ) 
    AND t1.group = t2.group) 
    WHEN MATCHED THEN UPDATE SET t1.comment = t2.comment; 

這樣做大部分(仍然需要一個單獨的查詢來覆蓋修訂= 1),但它是非常緩慢。

所以我的問題是,我如何儘可能有效地使用Max來爲每個組拉出最高版本?

回答

2

我會用lagmax

create table example_table(group_id number, revision number, comments varchar2(40)); 
insert into example_table values (1,1,1); 
insert into example_table values (1,2,2); 
insert into example_table values (1,3,null); 
insert into example_table values (2,1,1); 
insert into example_table values (2,2,2); 
insert into example_table values (2,3,3); 
insert into example_table values (2,4,null); 

select * from example_table; 

merge into example_table e 
using (select group_id, revision, comments, lag(comments, 1) over (partition by group_id order by revision nulls last) comments1 from example_table) u 
on (u.group_id = e.group_id and nvl(u.revision,0) = nvl(e.revision,0)) 
when matched then update set comments = u.comments1; 

select * from example_table; 
+1

呀,這似乎工作。 所以這個答案加上這個http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions001.htm#SQLRF06174(關於分析函數的部分)幫了我很多。 –

+0

UPDATE語句不起作用 - WITH子句不能在UPDATE之前,它需要在UPDATE之後。在MERGE的ON條件下使用NVL是有風險的 - 如果0是修改的合理值之一,那該怎麼辦?最好寫「或者u.revision爲null,v.revision爲null」。 (事實上​​,如果桌子有主鍵,情況會更好!)否則,這是正確的答案,很好! – mathguy

+0

@mathguy當然不會。建立答案時,這只是我的混亂。正確的答案是合併而不是更新。 – Kacper