我想实现table1中的代码转换成说明。table1如下
ID  col1
a   1 2 3
b   2 4table2如下:
ID  text
1    A
2    B
3    C
4    D查询结果
ID  coltext
a   A B C
b   B D请问一句sql能搞定么?该如何写?

解决方案 »

  1.   

    with a as (select 'a' id,'1 2 3' col1 from dual
               union
               select 'b' id,'2 4' col1 from dual
               ),
        b as (select 1 id,'A' text from dual
              union
              select 2 id,'B' text from dual
              union
              select 3 id,'C' text from dual
              union
              select 4 id,'D' text from dual
              )
              
    SELECT ID,REPLACE(WMSYS.WM_CONCAT(TEXT),',',' ') TEXT FROM 
    (SELECT A.ID,B.TEXT
      FROM A,B
      WHERE INSTR(A.COL1,B.ID)>0)
    GROUP BY ID 
    a A B C
    b B D 
      

  2.   

    方法二:
    SQL> with a as (select 'a' id,'1 2 3' col1 from dual
      2             union
      3             select 'b' id,'2 4' col1 from dual
      4             ),
      5      b as (select 1 id,'A' text from dual
      6            union
      7            select 2 id,'B' text from dual
      8            union
      9            select 3 id,'C' text from dual
     10            union
     11            select 4 id,'D' text from dual
     12            )
     13  SELECT ID,max(SYS_CONNECT_BY_PATH(TEXT,' ')) text
     14  FROM
     15  (SELECT A.ID,B.TEXT,row_number()over(partition by a.id order by a.id) rn
     16    FROM A,B
     17    WHERE INSTR(A.COL1,B.ID)>0)
     18  START WITH rn=1
     19  connect by rn-1=prior rn and id=prior id
     20  group by id
     21  /
     
    ID TEXT
    -- --------------------------------------------------------------------------------
    a   A B C
    b   B D
      

  3.   

    楼上的方法有问题的
    由于子查询的规模是与b表相同,而不是基于A表字段内容对b表遍历
    目前想到两种情况无法解决:
    1、表一的数据如下
    ID  col1 
    a   1 1 1 
    b   2 4 
    2、表一的数举如下
    ID  col1 
    a   3 2 1 
    b   2 4 
    结果
      

  4.   

    尤其是这个问题就是把一段字符串逐字替换的问题,
    楼上提供的SQL文,只能解决这个需求的一部分情况。
    当这个字符串不是按照某种顺序排列的,而是乱序的,结果会有问题。
    以第二种SQL为例:
    当我需要的字符串是:'1 4 2 3'时,得到的结果会是'A B C D'而不是'A D B C'。
    另外当字符串中有重复数字的情况,结果也会有问题。
    比如:字符串'1 1 2 2 3 3 3'结果是'A B C'而不是'A A B B C C C'。
      

  5.   

      按照fxianxian 的方法,那么我必须知道数据库中table1和table2的数据吗?
      
      

  6.   

    哎,本应该对的,可是结果却有问题。
    select FF.text,
      (select trim(max(sys_connect_by_path(YY.col1,' '))) 
       from (select substr(FF.text,1+(level-1)*2,1) val
                   ,level rn
             from dual
             connect by rownum < length(replace(FF.text,' ',''))+1) TT,bb YY
       where TT.val = YY.ID
       connect by rn-1 = prior rn
       start with rn=1)
    from aa FF
    问题核心,貌似经过两层迭代以后,在最内层循环中始终都只能得到FF的第一行记录的text。
    之差这一点了,看看有哪位老大能够把这个问题解决了。
      

  7.   

    如果TABLE1的行固定的話
    就用UNION
    不固定的話
    還要好好想想
      

  8.   

    终结了
    select * from aa
    id     text
    1     1 2 3
    2     3 4 5
    3     6
    select * from bb
    id   col1
    1    a
    2    b
    3    c
    4    d
    5    e
    6    f
    Select id,max(trim(sys_connect_by_path(col1,' '))),txt
    FROM (select id,col1,txt,lead(rn) over(partition by txt order by rn) pt, rn st
       from (select YY.id,row_number() over(order by txt,st desc) rn,col1,txt
             from (select distinct id id,substr(text,1+(level-1)*2,1) val ,level st ,text txt
                   from (select id,text,length(replace(text,' ',''))+1 len from aa)
                   connect by level < len) YY,bb
             where bb.id = YY.val
       order by txt))
    start with pt is null
    connect by pt = prior st
    group by txt,id
    ---------------------------
    d     val
    1      a b c
    2      c d e
    3      f
      

  9.   

    呵呵,被你看出来了。
    另外,我还在ITPub上发了帖子呢。
    不过最终还是把问题解决了。
    哈哈