web-dev-qa-db-ja.com

列を比較して、インデックスが存在するかどうかを確認します

現在、ALL_IND_COLUMNSを使用して、インデックスがその名前または使用している列で存在するかどうかを確認しています。問題は、特定の順序で列を持つインデックスが存在するかどうかしか確認できないことです。

テーブルに任意の名前のインデックスがあるかどうかを確認する必要がありますが、Column1、Column2、およびColumn3は任意の順序です。どうすればこれを行うことができますか?

複数の列を使用するインデックスが存在するかどうかを確認できます。

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

それを行う(少し複雑な)方法の1つです。


しかし、コメントで aasim.abdullahが注記 のように、同じ列のセットにあるが順序が異なる2つのインデックスは同じではありません。また、両方のインデックスを並べて使用することもできます。

1
SQB