表列表以及关键信息 - 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的主要内容,如果未能解决你的问题,请参考以下文章