テーブルのインデックス方法によって異なります。また、使用している SQL 実装によって異なります (SQL Server? MySq1? Oracle? MS Access? 何か他のもの?)。また、テーブルのサイズにも依存します (テーブルが小さい場合、テーブル スキャンはより高度なものよりも高速になる場合があります)。インデックスがインデックスをカバーしているかどうかも重要です(つまり、対応するデータ ページをフェッチするために追加のルックアサイドを必要とするのではなく、インデックス自体のデータでテストを満足させることができます)。テクニック X がテクニック Y よりも「優れている」とは言えません。
ただし、一般に、この場合は、相関サブクエリを使用する方がよいため、次のようになります。
select *
from table1 t1
where exists( select *
from table2 t2
where t2.key1 = t1.key1
)
and exists( select *
from table2 t2
where t2.key2 = t1.key2
)
結合も可能です:
select t1.*
from table1 t1
join table2 t2a = t2a.key1 = t1.key1 ...
join table2 t2b = t2b.key2 = t1.key2 ...
ただし、一致する組み合わせごとに1行が得られますが、distinct
キーワードを使用することで軽減できます。結合が必ずしも他の手法よりも効率的であるとは限らないことに注意してください。特に、distinct
as を使用する必要がある場合は、明確性を確保するために追加の作業が必要になります。