2011-06-13 5 views
3

DB2의 MySql의 GROUP_CONCAT 기능과 동일하게 원합니다.DB2 Distinct + xmlagg Query

나는 murows를 배치하기 위해 DB2의 XML Aggrigate 기능을 시도했다. 나를

ID | SPECIALISATION | BASIC_SKILL2   | BASIC_SKILL1  | 
----+---------------------------------------------------------------------+ 
1 | Java,C++  | Development,Development | Software,Software | 

을 초래하지만 BASIC_SKILL2, BASIC_SKILL1의 고유 한/고유 값을 원하는 제공

SELECT a.ID, 
     substr(xmlserialize(xmlagg(xmltext(concat(',', SPECIALISATION)))as varchar(1024)),2), 
     substr(xmlserialize(xmlagg(xmltext(concat(',,, BASIC_SKILL2)))as varchar(1024)),2), 
     substr(xmlserialize(xmlagg(xmltext(concat(',', BASIC_SKILL1)))as varchar(1024)),2) 
FROM candidate_resume_data a,candidate_skills_info b,skill_special_master c,skill_master_basic2 d,skill_master_basic1 e  
WHERE e.SKILL_BASIC1_ID = d.SKILL_BASIC1_ID 
     AND b.ID = a.ID  
     AND d.SKILL_BASIC2_ID = c.SKILL_BASIC2_ID 
     AND b.CANDIDATE_SPECIALISATION_ID = c.SKILL_SPECIAL_ID 
GROUP BY a.ID; 

.

ID | SPECIALISATION | BASIC_SKILL2 | BASIC_SKILL1 | 
----+-------------------+-------------------+------------------+ 
1 | Java,C++  | Development  | Software  | 
+0

사람들을 돕기 위해 테이블에 DDL을 게시 하시겠습니까? –

+0

DB2에서 GROUP_CONCAT와 유사한 기능이 없다는 것을 알고있는 한 – evermean

답변

1

동일한 것을 요청한 후 궁금한 점이 있습니다. 해결 방법은 DISTINCT를 사용하여 공통 테이블 식을 사용하는 것입니다.

SELECT t.id, XMLAGG(q1.specialization), XMLAGG(q2.basic_skill2), 
    XMLAGG(q3.basic_skill1) 
    FROM table_name t, 
    (SELECT DISTINCT id, specialization FROM table_name) q1, 
    (SELECT DISTINCT id, basic_skill2 FROM table_name) q2, 
    (SELECT DISTINCT id, basic_skill1 FROM table_name) q3 
    WHERE t.id = q1.id AND t.id = q2.id AND t.id = q3.id 
    GROUP BY t.id 

아니라 더 쉬운 방법이있을 수 있지만 내가 온 것입니다 : 귀하의 경우

WITH q1 (id, specialization) AS 
    (
    SELECT DISTINCT id, specialization 
     FROM table_name 
) 
SELECT q1.id, 
    XMLELEMENT(
     NAME "Specializations", 
     XMLAGG(
     XMLELEMENT(NAME "Specialization", q1.specialization))) 
    FROM q1 
    GROUP BY q1.id 

, 그것은 (XMLELEMENT의 보일러가 명확성을 위해 생략) 쉽고 명확 대신 부속 선택을 사용하는 것입니다 와 함께.

또한 XMLQUERY 및 XSLTRANSFORM과 같은 기능을 활용할 수도 있습니다. 수동 방식보다 훨씬 간단하고 오류가 적습니다.

1

모든 조인 값의 모든 조합을 제공하는 다중 조인으로 인해 중복이없는 테이블의 경우 선택 구분 기호가 작동하지 않습니다. 이로 인해 집계 함수에서 중복이 발생합니다.

나는 bys 및 집계 함수를 from 부분의 하위 쿼리로 푸시하는 것이 최상의 결과를 제공한다는 것을 알게되었습니다.

SELECT t.id, q1.values, q2.values, q3.values 
FROM table_name t, 
inner join (select t1.id, listagg(t1.value,',') as values 
      from table_name1 t1 inner join table_name t on t.id=t1.id 
      group by t1.id) q1 on t.id = q1.id 
inner join (select t2.id, listagg(t2.value,',') as values 
      from table_name2 t2 inner join table_name t on t.id=t2.id 
      group by t2.id) q2 on t.id = q2.id 
inner join (select t3.id, listagg(t3.value,',') as values 
      from table_name3 t3 inner join table_name t on t.id=t3.id 
      group by t3.id) q3 on t.id = q3.id