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 )
)
我正在使用以下查询获取 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 )
)