[英]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.