1. ホーム
  2. sql

あるテーブルで、別のテーブルに対応する行がない場合に、その行を見つける方法

2023-10-26 20:52:10

質問

2 つのテーブルの間に 1:1 のリレーションシップがあります。私はテーブルBに対応する行を持っていないテーブルAのすべての行を見つけたい。

SELECT id 
  FROM tableA 
 WHERE id NOT IN (SELECT id 
                    FROM tableB) 
ORDER BY id desc

idは両方のテーブルの主キーです。主キーのインデックスとは別に、tableA(id desc)のインデックスも持っています。

H2 (Java embedded database) を使用すると、tableB のフルテーブルスキャンになります。私はフルテーブルスキャンを避けたいのです。

このクエリを高速に実行するには、どのように書き直せばよいでしょうか。どのようなインデックスが必要でしょうか?

どのように解決するのですか?

select tableA.id from tableA left outer join tableB on (tableA.id = tableB.id)
where tableB.id is null
order by tableA.id desc 

もしあなたのデータベースがインデックスの交差を行う方法を知っているならば、これは主キーインデックスにのみ影響します。