0

重複の可能性:
INNER JOIN ON と WHERE 句

次の2つのコードがあります。

SELECT * FROM people,people_emails,members
WHERE people_emails_person=people_id
AND members_person=people_id

SELECT * FROM people
INNER JOIN people_emails ON people_id = people_emails_person
INNER JOIN members ON people_id = members_person

どちらも同じ結果を生成しますが、どちらを使用するのが正しい/より良いクエリですか?

4

4 に答える 4

2

現状では、これら 2 つのクエリはまったく同じです。1 つ目は、"古いスタイル" の結合を使用します。

最初のスタイルを使用するのは非常に「スタイルが悪い」です。スタイルは、アウターと右の結合を表現するために使用される場合に明らかになるほど明確ではないと思います。

常に最初のスタイルでそれを行ってきた人もいますが、そのようなスタイルの方がわかりやすいと言う人もいるでしょう。

于 2013-02-02T22:51:28.473 に答える
1

2 番目の方が優れていますが、どちらも改善の余地があります。* を選択すると、必要以上のフィールドが自動的に選択されます。あなたの場合、 people_emails_person 、 people.people_id 、 members_person.people_id は常に同じ値になるため、必要なのはそのうちの1つだけです。

質問に戻りますが、2 番目の方が優れている理由は、おそらく実行速度が速いからです。

于 2013-02-02T22:53:48.433 に答える
1

どちらも技術的には同等ですが、2 つ以上のテーブルを結合していて (特にテーブルが大きい場合)、クエリの完了に時間がかかる場合は、プランの順序を制御すると役立つことがあります。明示的な結合 ( INNER JOINs を使用した 2 番目のもの) と設定の微調整で行うことができます。

たとえば、PostgreSQL を使用している場合は、join_collapse_limit=1指定した正確な順序でクエリが結合されるように設定できます。これは、明示的な結合を使用する場合にのみ機能します。プランが奇妙で予期しないことを実行して、クエリが非常に遅くなることがありますが、自分の方法の方が高速であることがわかっていて、プランナーに自分の方法で実行するように指示したい場合は、それを指定できます。詳細については、postgresでの明示的な結合に関するこの記事を参照してください。もちろん、これは使用している SQL によって異なります。

于 2013-02-02T23:01:43.333 に答える
0

どちらも正しいですが、WHERE 構文はよりリレーショナル モデル指向であるため、最初のクエリの方が優れているはずです。とにかく、暗黙の JOIN ANSI 構文は古く、あまり明白ではなく、お勧めできません。

于 2013-02-02T22:55:04.633 に答える