Oracle получить различие в функции xmlagg - PullRequest
1 голос
/ 04 августа 2020

Мне нужно выделить функцию xmlagg. Например, следующий запрос

select
       xmlagg(xmlelement(e, names.name || ' ')).extract('//text()').getclobval()
           within group (order by names.name ) names,
       xmlagg(xmlelement(e, actions.action || ' ')).extract('//text()').getclobval()
           within group ( order by actions.action) actions
from
json_table('[{"name": "Name1"}, {"name": "Name2"}, {"name": "Name3"}]', '$[*]'
                    columns (name varchar2 path '$.name')) names,
json_table('[{"action": "Call"}, {"action": "Write"}, {"action": "Write"}]', '$[*]'
                    columns (action varchar2 path '$.action')) actions

возвращает

NAMES                                                 | ACTIONS
-----------------------------------------------------------------------------------------------------------
Name1 Name1 Name1 Name2 Name2 Name2 Name3 Name3 Name3 | Call Write Write Call Write Write Call Write Write 

Мне нужно получить результат типа

NAMES             | ACTIONS
-------------------------------
Name1 Name2 Name3 | Call Write  

1 Ответ

2 голосов
/ 04 августа 2020

Я думаю, что проще сначала выбрать отдельные значения в подзапросе:

select 
    (
        select xmlagg(xmlelement(e, name || ' ') order by name).extract('//text()').getclobval()
        from (
            select distinct name
            from json_table(
                '[{"name": "Name1"}, {"name": "Name2"}, {"name": "Name3"}]', '$[*]'
                columns (name varchar2 path '$.name')
            ) names
        ) n
    ) names,
    (
        select xmlagg(xmlelement(e, action || ' ') order by action).extract('//text()').getclobval()
        from (
            select distinct action
            from json_table(
                '[{"action": "Call"}, {"action": "Write"}, {"action": "Write"}]', '$[*]'
                columns (action varchar2 path '$.action')
            ) actions
        ) a
    ) actions
from dual

Обратите внимание, что order by из xmlagg() лучше подходит в функции.

Демонстрация на DB Fiddle :

NAMES              | ACTIONS    
:----------------- | :----------
Name1 Name2 Name3  | Call Write 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...