Наткнулся на ваш вопрос после того, как сам задал тот же.Решение, которое я придумал, заключается в использовании общего табличного выражения с DISTINCT.
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 исключен для ясности):
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
Возможно, есть более простой способ, но я придумал это.
Также вы можете воспользоваться такими функциями, как XMLQUERY и XSLTRANSFORM.Намного проще и менее подвержено ошибкам, чем ручное управление.