现有表table1,table2
table1:
(table1id,   name)
  1          记录1
  2          记录2
  3          记录3table2
(table2id,   team)
  21         1,2
  31         2,3现要取得table2的table2id,team字段,如何能将team的保存的table1的ID值1,2转换成name值记录1,记录2,并且仍以逗号分隔?谢谢
 

解决方案 »

  1.   

    我以为挺简单的,原来这么复杂啊,还要用存储过程啊
    一条SQL语句搞不定?
      

  2.   

    其实用SQL应该也能跑出来,就是复杂点,先要把team拆分,然后再关联table1,然后再合并,我晚上回家有空的话帮你想想怎么做
    你需要确认下team里的格式是不是固定的2个数字用,隔开的?
    固定的会好做许多,不固定的话,估计还是存储过程简单点
      

  3.   


    对,如果能确定team的大概模式,就可以一句SQL搞定.
      

  4.   

    10GSELECT table2id, wmsys.wm_concat(name)
      FROM (SELECT *
              FROM table2 t2
              LEFT JOIN table1 t1 
              ON instr(REPLACE(t2.team, t1.table1id, '*'),'*') > 0)
     GROUP BY table2id9iSELECT t.table2id, substr(MAX(sys_connect_by_path(t.NAME, ',')), 2)
      FROM (SELECT a.*
                  ,row_number() over(PARTITION BY a.table2id ORDER BY a.NAME) rn
              FROM (SELECT *
                      FROM table2 t2
                      LEFT JOIN table1 t1 
                      ON instr(REPLACE(t2.team,t1.table1id,'*'),'*') > 0) a) t
     GROUP BY t.table2id
     START WITH rn = 1
    CONNECT BY rn - 1 = PRIOR rn AND t.table2id = PRIOR t.table2id
    *是随便取的一个字符,只要不出现在team里面的都行.
      

  5.   

    高手就是多,非常感谢,待我试试team只用逗号分隔,但数量不定
      

  6.   

    测试了一下,好像有问题,team值的数目不正确
      

  7.   

    这个问题后来我发现有隐患,
    如果team里面的值互不为对方的子串,就没问题,不然就得改,
    比如果都是5位串,那么就没问题,甚至不用REPLACE,有instr就行了...如果team是(123,1234)这样的数,然后还有12这样数,就要改一下,
    不然,instr('123,1234','12')也是成立的,但12显然不在(123,1234)中
    我的想法是在team前后先加一个分隔符,也就是先变成',123,1234,'
    然后replace成*,再instr字串',*,',这样就应该没问题了.
      

  8.   


    说的没错误,确实有此问题,但好像加上分隔符也不行,例如:我是这样写的SQL
    SELECT table2id, wmsys.wm_concat(name)
      FROM (SELECT *
              FROM table2 t2
              LEFT JOIN table1 t1 
              ON instr(REPLACE(',' || t2.team || ',', t1.table1id, ',,,'),',,,') > 0)
     GROUP BY table2id
    对于数据(3,46)竟然被分成了(3,46,4,6)是什么原因?