查询以获取具有NOT NULL列的唯一索引-Oracle

时间:2019-04-29 01:05:04

标签: oracle plsql null

当前,我正在尝试查找表中定义的所有唯一索引,这些索引对于Oracle数据库而言为 NOT NULL 。我的意思是,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')

上面的查询为我提供了具有关联列的所有唯一索引,但是我不确定如何将上面的查询与具有 NULLABILITY ALL_TAB_COLS >表中所有列的数据。

我尝试将表与索引连接在一起,并尝试了子查询,但是没有得到合适的结果。

因此,请您对此发表评论。

1 个答案:

答案 0 :(得分:2)

分析功能和内联视图可以提供帮助。

通过分析函数,您可以返回详细数据,还可以基于单独的窗口创建该数据的摘要。详细的结果包括索引所有者,索引名称和列名称,但计数仅针对每个索引所有者和索引名称。

第一个内联视图连接三个表,返回详细信息,并具有分析功能以生成所有列的计数和所有可为空的列的计数。第二个嵌入式视图仅选择这两个计数相等的行。

--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;

分析功能和内联视图很棘手,但是一旦您学习了如何使用它们,它们将非常强大。