2011-06-24 7 views
2

私はクエリを記述するさまざまな方法を探していた、と私はあなたのすべては、以下のオプションで行くには良い方法だと思いますどの方法思ったんだけど:リンクされたテーブルまたはサブクエリ?

SELECT a.salary 
    FROM emp a 
    JOIN emp b ON a.salary < b.salary 
WHERE b.id = 200 

または

SELECT salary 
    FROM emp 
WHERE salary < (SELECT salary 
        FROM emp 
        WHERE id = 200) 

私はテーブルの中で約300のレコードでいくつかの実行時間を行い、それらはほぼ同じように出てくるので、これは本当に好みと受け入れられた標準についてのことです。私は個人的に第2の方法がより好きです(私に読んでほしい)。私は第一が標準だと感じている。あなたはどう思いますか?

+0

どのデータベースについてですか? –

+0

http://www.eggheadcafe.com/software/aspnet/32705705/join-vs-subquery.aspx –

+0

実行計画を確認し、最適なものを使用するクエリを選択する必要があります。 RDMSに依存して、これらのクエリは同じプランを生成する場合と生成しない場合があります。また、 'EXIST'または' NOT EXIST'を使うようにクエリを書き直し、実行計画もチェックすることができます。 – a1ex07

答えて

3

実際にクエリ自体のコンテキストに依存しているので、この質問には明確な答えはないと思います。& RDMS。

あなたのケースでは、300件のレコードで調査を行っています。約3,000,000?違いはありますか?

個人的に私は助けることができればサブクエリ以上のジョインが好きですが、私が言ったように、これは実際にケースバイケースで決定されます。

1

SQLは宣言型言語であり、は広く、は、データベースに最適なものを教え、最適な方法を決定するためにデータベースに伝えることを意味します。

この理由から、目的を最も明快に/可読にする方法でクエリを書くことは、多くのことが言われています(サブクエリがここで理にかなっている理由です)。

ただし、すべてのRDBMSが等しくないわけではなく、技術的には同じですが異なって書かれたクエリを「同等」にするクエリ・オプティマイザの能力はdbごとに異なります。

たとえば、MySQLはネストループ結合アルゴリズムしか使用できません。大規模なデータセットのサブクエリを扱うときには問題になる可能性があります。オプティマイザがバックグラウンドで何をしているのかを見て、さまざまなデータセットで試してみる必要があります。

関連する問題