表列表以及关键信息 - Oracle

Posted

技术标签:

【中文标题】表列表以及关键信息 - Oracle【英文标题】:List of tables along with key information - Oracle 【发布时间】:2019-09-24 15:34:47 【问题描述】:

我正在尝试从 Oracle 元数据表中获取表列表、列信息,包括数据类型。您可以看到下面的列列表。不知何故,我正在提取的主键和外键约束数据似乎正在为该表的所有列复制,而我预计约束表中未标记为主键或外键的列为 null。 我使用了左外连接,但由于连接条件,它似乎没有按预期工作。任何帮助将不胜感激。

SELECT AO.OWNER, 
AO.OBJECT_NAME, 
ATC.COLUMN_NAME, 
ATC.DATA_TYPE, 
ATC.NULLABLE,
AC.CONSTRAINT_NAME
FROM ALL_OBJECTS AO
JOIN
ALL_TAB_COLUMNS ATC
ON AO.OBJECT_NAME=ATC.TABLE_NAME
LEFT  JOIN
ALL_CONS_COLUMNS ACC
ON 
--ACC.column_name=ATC.column_name and
ACC.TABLE_NAME=ATC.TABLE_NAME
inner JOIN
ALL_CONSTRAINTS AC
    ON 
     AC.TABLE_NAME=ACC.TABLE_NAME
     AND
     AC.CONSTRAINT_NAME=ACC.CONSTRAINT_NAME
     --and atc.table_name=ac.table_name
WHERE AO.OBJECT_TYPE = 'TABLE'
 AND AO.OWNER = 'XYZ'
 AND AO.OBJECT_NAME='ABC'
AND CONSTRAINT_TYPE IN ('P','R')
ORDER BY AO.OBJECT_NAME, ATC.COLUMN_NAME

【问题讨论】:

您能否编辑您的问题,并包含您的查询产生的至少一些行的输出,足以让我们看到正在复制的内容。 您的联接在其条件中不包含owner;您在多个模式中是否有相同的表/约束?还有为什么要注释掉列名条件? Alex,所有者 我觉得不重要,因为我在多个模式中没有相同的表/约束。此外,column_name 条件似乎只针对主键和外键返回列/表数据,几乎就像它是一个内连接(而它是一个左外连接),所以我尝试删除该条件以进一步检查 【参考方案1】:

我认为您的联接条件不正确,必须在联接条件中使用 owner,因为 all_ 视图正在使用

您应该尝试以下查询:

SELECT AT.OWNER, 
AT.TABLE_NAME, 
LISTAGG(ATC.COLUMN_NAME,',') WITHIN GROUP (ORDER BY ATC.COLUMN_ID) AS  COLUMN_NAMES,
LISTAGG(ATC.DATA_TYPE,',') WITHIN GROUP (ORDER BY ATC.COLUMN_ID) AS  DATA_TYPE, 
LISTAGG(ATC.NULLABLE,',') WITHIN GROUP (ORDER BY ATC.COLUMN_ID) AS  NULLABLE,
AC.CONSTRAINT_NAME
FROM ALL_TABLES AT
JOIN
ALL_TAB_COLUMNS ATC
ON AT.TABLE_NAME=ATC.TABLE_NAME
AND AT.OWNER = ATC.OWNER
LEFT JOIN
ALL_CONS_COLUMNS ACC
ON ATC.COLUMN_NAME = ACC.COLUMN_NAME
AND ACC.TABLE_NAME = AT.TABLE_NAME
AND AC.OWNER = ACC.OWNER
LEFT JOIN ALL_CONSTRAINTS AC
ON AT.TABLE_NAME = AC.TABLE_NAME
AND AC.CONSTRAINT_NAME = ACC.CONSTRAINT_NAME
AND AT.OWNER = AC.OWNER
WHERE AT.OBJECT_TYPE = 'TABLE'
 AND AT.OWNER = 'XYZ'
 AND AT.OBJECT_NAME='ABC'
AND CONSTRAINT_TYPE IN ('P','R')
GROUP BY AT.OWNER, 
AT.TABLE_NAME, 
AC.CONSTRAINT_NAME

干杯!!

【讨论】:

谢谢。我正在尝试执行此操作。您的查询中似乎存在一些语法错误。会到达那里:)

以上是关于表列表以及关键信息 - Oracle的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中所有标识列的列表

oracle查询怎么多个表的第一列

外键列表及其在 Oracle DB 中引用的表

哈希表详解

哈希表详解

使用特定表名的 Oracle 视图列表