Oracle11g 获取每个表一行中表的所有主键的列表

Oracle11g 获取每个表一行中表的所有主键的列表,oracle11g,primary-key,Oracle11g,Primary Key,我在一个模式中有一个110个表的列表,我想得到所有主键的列表。这些表将有多个主键。 我希望结果是每个表一行,所以输出应该是110行 我用来获取主键的查询是 `SELECT cols.table_name, cols.column_name FROM all_constraints cons, all_cons_columns cols WHERE cols.table_name in ('C_ACTIVITY','C_HLD') AND cons.constraint_type = 'P

我在一个模式中有一个110个表的列表,我想得到所有主键的列表。这些表将有多个主键。 我希望结果是每个表一行,所以输出应该是110行

我用来获取主键的查询是

`SELECT cols.table_name,  cols.column_name
 FROM all_constraints cons, all_cons_columns cols
 WHERE cols.table_name in ('C_ACTIVITY','C_HLD')
 AND cons.constraint_type = 'P'
 AND cons.constraint_name = cols.constraint_name
 AND cons.owner = cols.owner`
上述查询的输出是

`C_ACTIVITY PK1
 C_ACTIVITY PK2
 C_HLD P1
 C_HLD P2
 C_HLD P3`
但我希望输出是

`C_ACTIVITY PK1,PK2
 C_HLD P1,P2,P3`

我尝试使用Pivot,但无法获得所需的输出

按表名分组并使用LISTAGG生成字符串:

 SELECT 
  cols.table_name, 
  LISTAGG(cols.column_name, ',') WITHIN GROUP (order by cols.position) as columns
 FROM all_constraints cons
 JOIN all_cons_columns cols 
   ON cons.owner = cols.owner AND cons.constraint_name = cols.constraint_name
 WHERE cols.table_name in ('C_ACTIVITY','C_HLD')
 AND cons.constraint_type = 'P'
 GROUP BY cols.table_name;

感谢您通过添加缺少的订单。我只是注意到我们在cols.table_name中查找表名。想一想,我会把它改为cons.table_name。对于主键约束,表名将相等,因此您可以使用任一表。但我认为说“给我表x和y的所有主键约束,然后得到相关列”比说“在cons中查找主键约束,在cols中查找某些表并保留匹配项”更直接(可能更快)。