我想实现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能搞定么?该如何写?
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能搞定么?该如何写?
解决方案 »
- 写sql遇到了一个invalid number错误
- 属于B表区段之间,在A表没有出现的数据
- 对Oracle备份计划和恢复方法可行性的疑问,请大家不吝赐教啊
- 用sqlplus能不能插入blob,clob,long raw和bfile等数据类型的值
- Design and create and test two master-detail forms to do entry, query, delete and update of the following:
- oracle建表的问题,往大家多多指导
- 将字符串直接当成NUMBER来比较大小的问题
- Oracle的OracleOraHome81ManagementServer服务起不来,急啊!高手请帮忙!
- 我下载了9i安装后,发现一奇怪问题???
- 怎样根据一个表的某个字段排序建立这个表的视图
- 两个表同两个字段的数据放在第三张表的一个字段中
- 小弟吐血求救-oracle存储过程问题-急急11111
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
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
由于子查询的规模是与b表相同,而不是基于A表字段内容对b表遍历
目前想到两种情况无法解决:
1、表一的数据如下
ID col1
a 1 1 1
b 2 4
2、表一的数举如下
ID col1
a 3 2 1
b 2 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'。
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。
之差这一点了,看看有哪位老大能够把这个问题解决了。
就用UNION
不固定的話
還要好好想想
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
另外,我还在ITPub上发了帖子呢。
不过最终还是把问题解决了。
哈哈