Oracle 如何只为一个索引抓取列?

Oracle how to grab columns for just one index?

我正在使用以下查询获取 table 上的索引列及其数据类型:

SELECT DISTINCT COL.COLUMN_NAME, COL.DATA_TYPE 
FROM DBA_IND_COLUMNS IND
  INNER JOIN DBA_TAB_COLUMNS COL
    ON ( IND.TABLE_OWNER = COL.OWNER AND IND.TABLE_NAME = COL.TABLE_NAME        
AND IND.COLUMN_NAME = COL.COLUMN_NAME)
WHERE IND.TABLE_NAME = 'MY_TABLE' AND TABLE_OWNER = 'SCHEMA'

但是我怎样才能只获取一个索引的列,而不是所有索引的列?

例如: 如果 table 有索引:

索引 1:column_a、column_b
INDEX2: column_c,column_d

我当前的查询将导致:

column_a, varchar
column_b, varchar
column_c, varchar
column_d, varchar

但我希望它的结果是:

column_a, varchar
column_b, varchar

如果您需要 table 的第一个索引中的列,请尝试使用子查询进行过滤:

SELECT DISTINCT COL.COLUMN_NAME, COL.DATA_TYPE 
FROM DBA_IND_COLUMNS IND
  INNER JOIN DBA_TAB_COLUMNS COL
    ON ( IND.TABLE_OWNER = COL.OWNER AND IND.TABLE_NAME = COL.TABLE_NAME        
AND IND.COLUMN_NAME = COL.COLUMN_NAME)
WHERE IND.TABLE_NAME = 'MY_TABLE' AND TABLE_OWNER = 'SCHEMA'
  AND INDEX_NAME = (SELECT MIN(INDEX_NAME)
                       FROM DBA_IND_COLUMNS IND2
                      WHERE     IND2.TABLE_NAME = IND.TABLE_NAME
                            AND IND2.TABLE_OWNER = IND.TABLE_OWNER)

这甚至可以 re-written 具有一些分析功能。

由于您只需要第一个索引的列(按字母顺序),您可以尝试:

SELECT DISTINCT COL.COLUMN_NAME, COL.DATA_TYPE 
FROM DBA_IND_COLUMNS IND
    INNER JOIN DBA_TAB_COLUMNS COL
    ON ( IND.TABLE_OWNER = COL.OWNER AND IND.TABLE_NAME = COL.TABLE_NAME        
AND IND.COLUMN_NAME = COL.COLUMN_NAME)
WHERE IND.TABLE_NAME = 'MY_TABLE' AND TABLE_OWNER = 'SCHEMA'
AND INDEX_NAME = 
(
    SELECT MIN(INDEX_NAME) 
    FROM DBA_IND_COLUMNS IIND
    INNER JOIN DBA_TAB_COLUMNS CCOL
    ON ( IIND.TABLE_OWNER = CCOL.OWNER AND IIND.TABLE_NAME = CCOL.TABLE_NAME )       
)