繁体   English   中英

SQL 中的 LISTAGG 用法

[英]LISTAGG usage in SQL

我正在尝试提取架构,表名,否。 单个查询中的记录数、列数、列名(逗号分隔)和主键列名(逗号分隔)。

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

谢谢,

首先分别获取您的聚合(列数和列表加键列列表),然后加入。

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM