2013-01-09 74 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) –