Запрос на получение уникальных индексов со столбцами NOT NULL - Oracle - PullRequest
0 голосов
/ 29 апреля 2019

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

Поэтому, если в моей таблице два уникальных индекса, я хочу получить конкретный уникальный индекс, в котором все столбцы имеют ограничения NOT NULL.

Я пришел с этим запросом:

select ind.index_name, ind_col.column_name, ind.index_type, ind.uniqueness
from sys.dba_indexes ind
inner join sys.dba_ind_columns ind_col on ind.owner = ind_col.index_owner and ind.index_name = ind_col.index_name
where ind.owner in ('ISADRM') and ind.table_name in ('TH_RHELOR') and ind.uniqueness IN ('UNIQUE')

Приведенный выше запрос дает мне все уникальные индексы со связанными столбцами, но я не уверен, как мне присоединить указанный выше запрос к ALL_TAB_COLS , который имеет данные NULLABILITY для всех столбцов таблицы.

Я пытался объединить эту таблицу с индексами и пробовал также подзапрос, но не получил подходящих результатов.

Следовательно, попросил бы вас прокомментировать то же самое.

1 Ответ

2 голосов
/ 29 апреля 2019

Аналитические функции и встроенные представления могут помочь.

Аналитические функции позволяют вам возвращать подробные данные, а также создавать сводку по этим данным на основе отдельных окон. Подробные результаты включают в себя владельца индекса, имя индекса и имя столбца, но это только для владельца индекса и имени индекса.

Первое встроенное представление объединяет три таблицы, возвращает подробную информацию и имеет аналитические функции для генерации счетчика всех столбцов и счетчиков всех столбцов, допускающих значение NULL. Второе встроенное представление выбирает только те строки, в которых эти два числа равны.

--Unique indexes and columns where every column is NOT NULL.
select owner, index_name, column_name
from
(
    --All relevant columns and counts of columns and not null columns.
    select
        dba_indexes.owner,
        dba_indexes.index_name,
        dba_tab_columns.column_name,
        dba_tab_columns.nullable,
        count(*) over (partition by dba_indexes.owner, dba_indexes.index_name) total_columns,
        sum(case when nullable = 'N' then 1 else 0 end)
            over (partition by dba_indexes.owner, dba_indexes.index_name) total_not_null_columns
    from dba_indexes
    join dba_ind_columns
        on dba_indexes.owner = dba_ind_columns.index_owner
        and dba_indexes.index_name = dba_ind_columns.index_name
    join dba_tab_columns
        on dba_ind_columns.table_name = dba_tab_columns.table_name
        and dba_ind_columns.column_name = dba_tab_columns.column_name
    where dba_indexes.owner = user
        and dba_indexes.uniqueness = 'UNIQUE'
    order by 1,2,3
)
where total_columns = total_not_null_columns
order by 1,2,3;

Аналитические функции и встроенные представления сложны, но они очень эффективны, когда вы научитесь их использовать.

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