Как получить все столбцы из всех таблиц в конкретной базе данных, которые не являются частью первичных ключей и внешних ключей

Я действительно новичок в Stackru извинения за любые ошибки.

Я работаю над Qlikview. Он не допускает столбцы с одинаковыми именами в двух разных таблицах. Я использовал для создания псевдонимов для каждого столбца каждый раз, когда мне нужно импортировать таблицы из оракула. Теперь я хочу иметь дело с большой базой данных. Поэтому я решил создать процедуру, которая принимает в качестве входных данных весь столбец без ограничений и добавляет туда имя таблицы с именами столбцов.

Я написал SQL-запрос с базовыми знаниями, который теперь возвращает первичные столбцы, но при переходе к внешним ключам не работает (он извлекает столбцы, имеющие внешние ключи)

Мой запрос выглядит следующим образом

SELECT C.table_name,
        C.column_name
FROM user_constraints a,
  user_cons_columns b,
  ALL_TAB_COLUMNS C
WHERE a.OWNER          =b.owner
AND a.OWNER            =C.owner
AND C.COLUMN_NAME      !=b.COLUMN_NAME
AND a.CONSTRAINT_NAME  =b.CONSTRAINT_NAME
AND a.table_name       =b.table_name
AND a.table_name       =C.table_name
AND a.constraint_type IN('P','R')
AND a.table_name NOT LIKE 'BIN%'
AND A.TABLE_NAME NOT LIKE 'DEF%'
AND b.table_name NOT LIKE 'BIN%'
AND b.TABLE_NAME NOT LIKE 'DEF%'
AND C.table_name NOT LIKE 'BIN%'
AND C.TABLE_NAME NOT LIKE 'DEF%';

Любые предложения будут оценены

Спасибо

1 ответ

Решение

Это должно дать вам все столбцы во всех таблицах для данного имени схемы, где эти столбцы не являются частью первичного или внешнего ключа

SELECT  atc.owner,
    atc.table_name,
    atc.column_name 
FROM
    all_tab_columns atc
WHERE
    NOT EXISTS
    (
        SELECT  acc.owner,
            acc.table_name,
            acc.column_name
        FROM
            all_cons_columns acc
        LEFT
        JOIN    all_constraints ac ON acc.owner = ac.owner AND ac.constraint_name = acc.constraint_name AND ac.constraint_type IN ('P', 'R')
        WHERE
            atc.owner = atc.owner
        AND acc.table_name = atc.table_name
        AND acc.column_name = atc.column_name
    )
AND atc.owner = 'YOUR_SCHEMA_NAME'
ORDER
BY  1, 2
/
Другие вопросы по тегам