ORA-00923: использовать более (разделить) с Xmlagg в Oracle - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть запрос в приведенной ниже форме, и мне нужно, чтобы он был разделен по определенному столбцу, но когда я размещаю его таким образом, он выдает мне ошибку: из ключевого слова не найдено там, где ожидается

Select distinct t_name,  rtrim(xmlagg(xml element(e, text, ',').extract('//text()') order by c_id).getclobval(), ',' ) over (partition by t_name) col_list from all_cls where schema ='a' and table in ('tableA' , 'tableB')

В чем проблема и как я могу ее исправить, чтобы она правильно работала с xmlagg, как это делается для запроса ниже со списком agg:

Select distinct t_name,  listagg(text ',' ) within group(order by c_id) over (partition by t_name) col_list from all_cls where schema ='a' and table in ('tableA' , 'tableB')

1 Ответ

0 голосов
/ 27 апреля 2019

Похоже, вы хотите выбрать имя таблицы и столбцы, которые она содержит.

LISTAGG, в данном случае, не требует предложения OVER, потому что вам придется использовать GROUP BY (если вы также хотите получить имя таблицы), поэтому он будет выполнять разбиение работа; также GROUP BY - в свою очередь - делает DISTINCT ненужным.

Примерно так:

SQL> select table_name,
  2    listagg(column_name, ',' ) within group(order by column_id) col_list
  3  from all_tab_cols
  4  where owner = 'SCOTT'
  5    and table_name in ('DEPT' , 'BONUS')
  6  group by table_name;

TABLE_NAME COL_LIST
---------- --------------------------------------------------
BONUS      ENAME,JOB,SAL,COMM
DEPT       DEPTNO,DNAME,LOC

SQL>

XMLAGG версия будет выглядеть следующим образом; как и выше, специальное разбиение не требуется, поскольку GROUP BY делает это:

SQL> select table_name,
  2    rtrim(xmlagg(xmlelement(e, column_name || ',').extract('//text()')
  3      order by column_id).getclobval(), ',' ) col_list
  4  from all_tab_cols
  5  where owner = 'SCOTT'
  6    and table_name in ('DEPT' , 'BONUS')
  7  group by table_name;

TABLE_NAME COL_LIST
---------- --------------------------------------------------
BONUS      ENAME,JOB,SAL,COMM
DEPT       DEPTNO,DNAME,LOC

SQL>
...