コメントで、空のテーブルを削除 (ドロップ?) したいと言いました。正確なカウントは必要ないが、テーブルが空かどうかだけを知りたい場合は、ショートカット カウントを行うことができます。
select count(*) from table_name where rownum < 2;
オプティマイザは、最初の行に到達すると停止します - 実行計画は「count stopkey」操作を示しています - そのため、高速になります。空のテーブルの場合はゼロを返し、データのあるテーブルの場合は 1 を返します。データの量はわかりませんが、気にしないようです。
もちろん、カウントとドロップの間にはまだわずかな競合状態があります。
これは非常に奇妙なことのように思えます。アプリケーションがテーブルを使用している場合、テーブルが空であっても削除すると何かが壊れます。そうでない場合、それが (おそらく冗長である) かどうかは問題ではなく、関係なく削除することができます。混乱があると思われる場合は、ソース (DDL を含む) コントロールに何らかの作業が必要なようですね。
2 つのスキーマのいずれかのテーブルに行があるかどうかを確認するには、両方からカウントします。ユニオン付きのいずれか:
select max(c) from (
select count(*) as c from schema1.table_name where rownum < 2
union all
select count(*) as c from schema2.table_name where rownum < 2
);
... またはgreatest
と 2 つのサブ選択、たとえば:
select greatest(
(select count(*) from schema1.table_name where rownum < 2),
(select count(*) from schema2.table_name where rownum < 2)
) from dual;
いずれかのテーブルに行がある場合は 1 が返され、両方が空の場合は 0 のみが返されます。