2

スキーマ名とテーブル名の組み合わせに基づいて、ALL_TABLES ビューをクエリする必要があります。

2 つのスキーマ "A" と "B" があり、両方に同じテーブル "TAB1" があります。ここで私の要件は、スキーマ B ではなく、スキーマ A に関連付けられたテーブルを選択することです。

現在、以下に示すように、テーブル名と所有者名を連結する操作を行っています。

単一のクエリ内で複数の所有者とテーブル名の組み合わせを使用できます

select table_name from all_tables where concat(owner_name,table_name) in ('ATAB1','ATAB2','BTAB2','CTAB1') 
select table_name from all_tables where concat(owner_name,table_name) not in ('ATAB1','ATAB2','BTAB2','CTAB1')

ここでは、それぞれのテーブル名の組み合わせを持つ 3 つのスキーマ A、B、および C があります。

CONCAT 関数を使用せずに同じ結果を得るにはどうすればよいでしょうか。

4

3 に答える 3

2
WHERE 0=1
 OR (owner_name = 'A' AND table_name = 'T1')
 OR (owner_name = 'B' AND table_name = 'T2')
 OR (owner_name = 'A' AND table_name = 'T3')

奇妙なの0=1は、メンテナンスやコード生成を容易にするために、以下の行を構文的に同一にすることです。オプティマイザはそれを削除します。

于 2013-01-26T18:29:18.753 に答える
1

Oracle では、1 つのIN条件で複数の列を使用できます (その他の例については、ドキュメントを参照してください)。

select table_name
  from all_tables
 where (owner_name, table_name) in
         (('A','TAB1'), ('A','TAB2'), ('B','TAB2'), ('C','TAB1'))

これはおそらく、パフォーマンスの観点からはusr の回答と同等です。

于 2013-01-26T19:13:03.370 に答える
1

照合する必要がある文字列値を仮想テーブルに配置し、そのテーブルを結合でフィルターとして使用できます。

SELECT t.*
FROM all_tables t
INNER JOIN (
  SELECT 'A' AS owner_name, 'TAB1' AS table_name FROM DUAL
  UNION ALL SELECT 'A', 'TAB2' FROM DUAL
  UNION ALL SELECT 'B', 'TAB2' FROM DUAL
  UNION ALL SELECT 'C', 'TAB1' FROM DUAL
) s
 ON t.owner_name = s.owner_name
AND t.table_name = s.table_name
;

これにより、現在のアプローチよりもクエリプランナーに最適化の余地が増えると思います。

于 2013-01-26T18:56:41.667 に答える