Oracle(11g之前版本)中可能的递归查询,用于连接嵌套的字符串值

时间:2014-02-18 19:59:11

标签: sql oracle recursion multirow

我有一个关于表中多行注释的问题,我需要通过SQL提取为单个字符串。我有两个表:测试和评论。以下是我正在寻找的所需结果集的示例数据:

enter image description here

老实说,如果没有PL / SQL或某种形式的外部编程语言,我甚至不确定我能找到什么。我一直在与连接争吵,没有运气。任何帮助将不胜感激。

编辑:我应该提一下,每个comment_key值的result_key值的数量是可变的,并且该字符串格式无关紧要(间距等)。所以,简而言之,Result_Text(n)+ Result_Text(n + 1)+ ...

2 个答案:

答案 0 :(得分:0)

select 
  id, 
  name, 
  replace(replace(wmsys.wm_concat(replace(result_text, ',', chr(1)), 
    ',', ' '), chr(1), ',') as Comment
from (
  select id, name, result_text 
  from test left join comment using(comment_key)
  order by id, result_key
)
group by id, name
order by id

答案 1 :(得分:0)

有关以下查询的演示,请参阅SQL Fiddle

SELECT Test.ID, Test.Name,
  get_comma_separated_value(Test.ID) AS CommConcat
FROM Test

哦,根据您为 英语 提供的信息,您的结果只会是English comment.

以下是函数get_comma_separated_value的声明:

CREATE OR REPLACE FUNCTION get_comma_separated_value (input_val  in  VARCHAR2)
  RETURN VARCHAR2
IS
  return_text  VARCHAR2(10000) := NULL;
BEGIN
  FOR x IN 
  (
    SELECT Result_Text
    FROM Test
    INNER JOIN Comments ON Test.Comment_Key = Comments.Comment_Key
    WHERE Test.ID = input_val
    ORDER BY Comments.Result_Key 
  ) 
  LOOP
    return_text := return_text || ' ' || x.Result_Text ;
  END LOOP;
  RETURN LTRIM(return_text, ' ');
END;
/