oracle LEFT JOIN逗号分隔字符串

时间:2015-05-19 18:00:26

标签: sql oracle join

我有3张桌子:

RESULTS

ID NUMBER
TEXT VARCHAR
URL VARCHAR

KEYWORDS

ID NUMBER
KEYWORD VARCHAR

KEYWORD_RESULT

KEYWORD_ID NUMBER
RESULT_ID NUMBER

我想用逗号分隔的关键字选择结果。结果应如下所示:

ID  TEXT       URL           keywords
1   some text  www.some.com  keyword1, keyword2, keyword3

我如何选择这样的结果?

1 个答案:

答案 0 :(得分:2)

如果您拥有Oracle 11g第2版,则可以使用LISTAGG功能: http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions089.htm#SQLRF30030

select r.id, r.text, r.url
, listagg(k.keyword, ',') within group (order by k.keyword) as keywords
from results r
left join keyword_result kr on r.id = kr.result_id
left join keywords k on k.id = kr.keyword_id
group by r.id, r.text, r.url
order by r.id;

如果您的Oracle版本较低,则必须定义自己的函数以生成逗号分隔的列表,如下所示: Is there any function in oracle similar to group_concat in mysql? (请参阅get_comma_separated_value函数)。它看起来像这样:

CREATE OR REPLACE FUNCTION get_comma_separated_value (input_val  in  number)
  RETURN VARCHAR2
IS
  return_text  VARCHAR2(10000) := NULL;
BEGIN
  FOR x IN (SELECT k.keyword FROM keyword_result kr 
            join keywords k on kr.keyword_id = k.id 
            WHERE kr.result_id = input_val) LOOP
    return_text := return_text || ',' || x.keyword ;
  END LOOP;
  RETURN LTRIM(return_text, ',');
END;
/

然后查询看起来像:

select r.id, r.text, r.url
, get_comma_separated_value(r.id) as keywords
from results r
left join keyword_result kr on r.id = kr.result_id
left join keywords k on k.id = kr.keyword_id
group by r.id, r.text, r.url
order by r.id;