0

Table1 と Table2 の 2 つのテーブルがあり、Table2 の値に基づいて Table1 から値を選択しようとしています。現在、次のようにクエリを書いています。

SELECT Value From Table1
WHERE
(Key1 in
    (SELECT KEY1 FROM Table2 WHERE Foo = Bar))
AND
(Key2 in
    (SELECT KEY2 FROM Table2 WHERE Foo = Bar))

これは、クエリをコーディングする非常に効率の悪い方法のように思えます。これを記述するより良い方法はありますか?

4

1 に答える 1

5

テーブルのインデックス方法によって異なります。また、使用している 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キーワードを使用することで軽減できます。結合が必ずしも他の手法よりも効率的であるとは限らないことに注意してください。特に、distinctas を使用する必要がある場合は、明確性を確保するために追加の作業が必要になります。

于 2013-09-04T18:48:15.503 に答える