我想知道如何列出用户表名称及其主键名称作为第二列?
我正在做一半的工作,但我不知道还能做什么。
select table_name from user_tables ORDER BY (table_name) ASC
有谁知道怎么做?
谢谢
答案 0 :(得分:3)
这个简单的查询为您提供了一个表列表以及PK约束名称(但不是列名称):
select ut.table_name, uc.constraint_name
from user_tables ut
left join user_constraints uc
on ut.table_name = uc.table_name
and uc.constraint_type = 'P';
如果您想要列名,请记住PK可以有多个列!我们需要首先创建一个实用程序类型,因为collect()聚合函数:
create type ty_varchar_nt as table of varchar2(4000);
select ut.table_name, uc.constraint_name, cast(collect (uic.column_name) as ty_varchar_nt) as pk_cols
from user_tables ut
left join user_constraints uc
on ut.table_name = uc.table_name
and uc.constraint_type = 'P'
left join user_ind_columns uic
on uc.index_name = uic.index_name
group by ut.table_name, uc.constraint_name;
如果您不喜欢嵌套选项卡的格式,可以编写一个实用程序函数,它将NT作为输入并提供连接的逗号分隔字符串作为输出。只是没有时间自己做;)
答案 1 :(得分:1)
尝试使用 USER_CONSTRAINTS 加入 USER_TABLES 。
在 USER_CONSTRAINTS 过滤所有 constraint_type 的行等于'P'(主键)。在那里,您将获得 index_name 和 index_owner 值,您可以使用 USER_INDEXES 加入这些值,并从PRIMARY KEY获取列名称。
我希望我知道一种更直接的方式......但我没有。
祝你好运!答案 2 :(得分:1)
您可以使用以下查询
SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner
FROM all_constraints cons, all_cons_columns cols
WHERE cons.constraint_type = 'P'
AND cons.constraint_name = cols.constraint_name
AND cons.owner = cols.owner
ORDER BY cols.table_name, cols.position;