实际项目中,经常会出现这样一种设计。例如,一张项目表,有个项目负责人的字段,而项目和负责人出现一对多的关系。本来规范来说,应该建一张项目与负责人的关系表,但是很多时候,会直接采用多个项目负责人之间用逗号隔开存进这个字段的做法。如果存的是ID,查询时需要将对应的人带出来怎么办
借用帖子中的例子 http://bbs.csdn.net/topics/391023423?page=1#post-399141457
比较简单的是使用wm_concat函数
SELECT OID,(
SELECT wm_concat(b.zone_code||'-'||b.zone_name) FROM tableb b WHERE ','||a.zone_code||',' LIKE '%,'||b.zone_code||',%'
)zone_name
FROM tablea a;
但是,wm_concat并不保证顺序,排列顺序和执行计划有关系。可以采用下面的做法
SELECT OID,
(SELECT SUBSTR(MAX(SYS_CONNECT_BY_PATH(B.ZONE_CODE || '-' ||
B.ZONE_NAME,
',')),
2)
FROM TABLEB B
START WITH B.ZONE_CODE =
SUBSTR(A.ZONE_CODE,
1,
INSTR(A.ZONE_CODE || ',', ',', 1, 1) - 1)
CONNECT BY B.ZONE_CODE =
SUBSTR(A.ZONE_CODE,
INSTR(',' || A.ZONE_CODE, ',', 1, LEVEL),
INSTR(A.ZONE_CODE || ',', ',', 1, LEVEL) -
INSTR(',' || A.ZONE_CODE, ',', 1, LEVEL))) ZONE_NAME
FROM TABLEA A;