2015-05-19 70 views
0

我有3个表:甲骨文LEFT JOIN逗号分隔字符串

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

你有什么版本的Oracle? –

回答

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;