通过比较列检查索引是否存在

Jul*_*ira 5 index oracle oracle-11g-r2

我们目前正在使用 ALL_IND_COLUMNS 来检查索引是否存在通过其名称或它正在使用的列。问题是我们只能检查索引是否存在特定顺序的列。

我们需要检查一个表是否有任何名称的索引,但 Column1、Column2 和 Column3 的顺序是任意的。我们应该怎么做?

SQB*_*SQB 1

可以检查是否存在使用多个列的索引。

  WITH
     index_cols AS (
        SELECT
           table_name,
           index_name,
           COLLECT(column_name) AS column_names
        FROM all_ind_columns
        WHERE table_name = '&table_name'
        GROUP BY
           table_name,
           index_name
     ),
     target_cols AS (
        SELECT '&column_name_1' AS col_name FROM dual
        UNION SELECT '&column_name_2' FROM dual
     )
  SELECT
     ic.*
  FROM index_cols ic
  WHERE 
     (
        SELECT COUNT(*)
        FROM target_cols tc
        JOIN TABLE(ic.column_names) icc
           ON (tc.col_name = icc.COLUMN_VALUE)
     ) = (
        SELECT COUNT(*)
        FROM target_cols
     )
  ;
Run Code Online (Sandbox Code Playgroud)

是一种(有点复杂)的方法。


但正如aasim.abdullah在评论中指出的那样,同一列集上但顺序不同的两个索引并不相同。并且可以并排放置两个索引。