Использование LISTAGG в SQL - PullRequest
       0

Использование LISTAGG в SQL

0 голосов
/ 21 февраля 2020

Я пытаюсь вытащить схему, имя таблицы, нет. записей в нем, количество столбцов, имена столбцов (через запятую) и имена столбцов первичного ключа (через запятую) в одном запросе.

SELECT t.owner, 
       t.table_name, 
       t.num_rows,
       count(*),
       listagg(c.column_name,',') within group (order by c.column_name)columnlist,
       listagg(a.column_name,',') within group (order by a.column_name,a.constraint_name)keycolumns
FROM all_tables t
       left join
       all_tab_columns c on t.table_name = c.table_name
       left join
       all_cons_columns a on c.table_name = a.table_name
       inner join 
       all_constraints d on a.constraint_name = d.constraint_name     
where c.table_name = 'PROCESS_LOG'
and d.constraint_type = 'P'
and num_rows IS NOT NULL
GROUP  BY t.owner, 
          t.table_name,
          --c.column_name
          t.num_rows
ORDER BY t.num_rows DESC;

Проблема заключается в получении повторяющихся имен столбцов в списках, разделенных запятыми, и число столбцов выбрано неправильно. Не могли бы вы помочь мне исправить это?

Вывод:

OWNER | TABLE_NAME  | NUM_ROWS | COUNT(*) | COLUMNLIST                      | KEYCOLUMNS
------+-------------+----------+----------+---------------------------------+----------------
ABC   | PROCESS_LOG |          |       16 | A,A,A,A,B,B,B,B,C,C,C,C,D,D,D,D | C,C,C,C,D,D,D,D

Ожидаемое:

OWNER | TABLE_NAME  | NUM_ROWS | COUNT(*) | COLUMNLIST | KEYCOLUMNS
------+-------------+----------+----------+------------+-----------
ABC   | PROCESS_LOG |          |        4 | A,B,C,D    | C,D

Спасибо,

1 Ответ

1 голос
/ 21 февраля 2020

Сначала получите ваши агрегаты (количество столбцов и список плюс список ключевых столбцов) отдельно, затем присоединитесь.

with tableinfo as
(
  select 
    t.owner, 
    t.table_name, 
    t.num_rows,
    count(*) as num_cols,
    listagg(c.column_name, ',') within group (order by c.column_name) as columnlist
  from all_tables t
  join all_tab_columns c on c.owner = t.owner and c.table_name = t.table_name
  group by t.owner, t.table_name, t.num_rows
)
, pkinfo as
(
  select
    c.owner,
    c.table_name,
    listagg(cc.column_name, ',') within group (order by cc.position) as keycolumns
  from all_constraints c
  join all_cons_columns cc on cc.owner = c.owner and cc.constraint_name = c.constraint_name   
  where c.constraint_type = 'P'
  group by c.owner, c.table_name
)
select *
from tableinfo t
left join pkinfo pk using (owner, table_name)
where t.table_name = 'PROCESS_LOG'
order by t.num_rows desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...