Список таблиц вместе с ключевой информацией - Oracle - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь получить список таблиц, информацию о столбцах, включая тип данных, из таблиц метаданных Oracle.Вы можете увидеть список столбцов ниже.Каким-то образом данные ограничения первичного ключа и внешнего ключа, которые я извлекаю, похоже, реплицируются для всех столбцов рассматриваемой таблицы, в то время как я ожидаю нулевое значение для столбцов, которые не помечены как первичный ключ или внешний ключ в таблицах ограничений.Я использовал левое внешнее соединение, но кажется, что оно не работает должным образом из-за условий соединения.Любая помощь будет оценена.

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

1 Ответ

0 голосов
/ 24 сентября 2019

Я думаю, что ваши условия соединения не являются правильными, и 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

Cheers!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...