2013-01-09 103 views
0

我只是想用Oracle來完成一些艱鉅的任務。基於單列合併唯一行

我有一個包含3列

ColA ColB ColC ColD 
    --------------------------- 
    123  N  null 1 
    100  Y  AAAA 1 
    123  Y  XXXX 2 
    100  Y  YYYY 2 

我需要更新COLBCOLC顯示以下結果集的表。

ColA ColB ColC  ColD 
    ------------------------------- 
    123 Y  XXXX   1 
    100 Y  AAAA\YYYY 1 
    123 Y  XXXX   2 
    100 Y  YYYY   2 

我需要更新COLBY如有的唯一記錄包含Y其他N

而對於ColC我想更新由\分隔的值,其中兩行都包含一個值,否則只是該值。

我試圖用更新查詢做到這一點,但ghosh .........這似乎是不可能的。

任何人都可以提出一個可能的解決方案或什麼?

我被告知如果需要使用PL/SQL。會這樣嗎?

PS:我也看到了類似的其他問題,但還沒有任何解決方案。

編輯:我們需要更新只是那些行,其中1

+1

您在結果集中比輸入有更少的行。你刪除了一些?這隻能通過更新來實現? –

+0

+1用於觀察。我真的很抱歉。編輯。 – akhil

+2

爲什麼所有的行在COLA == 100 _not_'AAAA \ YYYY'?這意味着某種隱式排序,我無法看到如何通過提供的數據實現......您是否只希望隨機行具有這兩個值?最後,_why_你想這麼做嗎?把這個規範化或正確地規範化,讓COLA是唯一的是不是更有意義? – Ben

回答

1

查詢發現COLB和COLC如何看:

select 
    colA, 
    case when count(case when colB='Y' then 1 end) > 0 
    then 'Y' 
    else 'N' 
    end as colB, 
    LISTAGG(colC, '\') WITHIN GROUP (ORDER BY colA) AS colC 
from your_table 
group by colA; 

從此,你只是拍一個MERGE像

update your_table a 
using query b 
on (a.colA=b.colB and colD=2) 
when matched then update 
    a.colB=b.colB, 
    a.colC=b.colC 
+0

LISTAGG不會爲我工作,因爲我使用的是10g,我猜想它對於11g – akhil

+0

使用WM_CONCAT。 [http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php](http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php) –