现有表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,并且仍以逗号分隔?谢谢
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,并且仍以逗号分隔?谢谢
一条SQL语句搞不定?
你需要确认下team里的格式是不是固定的2个数字用,隔开的?
固定的会好做许多,不固定的话,估计还是存储过程简单点
对,如果能确定team的大概模式,就可以一句SQL搞定.
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里面的都行.
如果team里面的值互不为对方的子串,就没问题,不然就得改,
比如果都是5位串,那么就没问题,甚至不用REPLACE,有instr就行了...如果team是(123,1234)这样的数,然后还有12这样数,就要改一下,
不然,instr('123,1234','12')也是成立的,但12显然不在(123,1234)中
我的想法是在team前后先加一个分隔符,也就是先变成',123,1234,'
然后replace成*,再instr字串',*,',这样就应该没问题了.
说的没错误,确实有此问题,但好像加上分隔符也不行,例如:我是这样写的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)是什么原因?