お世話になっております。
条件はwhere句、結合条件はon句に書くと思いますが、
全てをon句に書くのはよくないでしょうか?
個人的な意見ですが、テーブル数が多い場合、
from句に指定されたテーブルはwhere句、それ以外のjoinで指定されたテーブルの条件は全てon句に書いた方が、どのテーブルの属性なのかはっきりするので見やすいと思っています。
外部結合が入らないことと、実行計画に変わりがないことが前提ですがみなさんどうしていますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
外部結合の場合は「実行結果」が変わってしまうので、使い分ける必要があります。
OUTER JOINのONに書く条件とWHERE句に書く条件とでは、条件の意味合いが違うんだな
内部結合の場合は実行結果は変わりません。
「実行計画」については、変わる可能性があります。SQLの文法上の意味としては、ONに記述する条件は結合の際に適用され、WHEREに記述する条件は結合した後の結果に適用されることになっているからです(外部結合で結果が変わる原因)。しかし、最近のデータベースのオプティマイザであれば内部結合の場合は結果が同じになることを理解しており、EXPLAINしてみるとWHERE句に記述した条件も通常効率がよくなる結合の際 or 前に適用されているはずです。実際に実行計画が変わることはほぼないと考えています
私が内部結合のSQLを書く場合は、論理データモデルとして結合の中心として考えるテーブル、通常FROM句の最初に指定するテーブルに適用する条件であれば、意味合いとしてそれは結合条件というよりは抽出条件であると捉えてWHERE句に記述します(実際にどれを駆動表とするかはオプティマイザが選択するのですが)。
投稿2017/09/13 12:39
編集2017/09/13 12:56総合スコア1149
0
ベストアンサー
一番理解されるのはベン図と同じように記述することだと思います。
ですが、そのままの記述とすると冗長だったりするので、記述する際には頭の片隅にある程度ですね。
私の回答としては、whereとjoinどちらに記述するかは、読みやすさや好み以前に、実行計画を最優先です。
terateilでの回答する場合なども、実際の実行計画など知る由もない訳ですが、チューニングするとしても追加・変更が少なくて済みそうな記述をある程度は意識しています。
過去にSQLに対して修正が行われた時に、性能が劣化した時がありました。
内容を確認すると、修正内容は条件の追加で、サブクエリーでネストしているSQLだったので、該当するネスト内にwhere条件を追加する修正を行っていました。
稼働後だったので、インデックスの追加は行わず、条件をネストの一番外側になるように修正。
上記などは、後から見ると説明なしでは、なんで?ってなりますよね。
もう一度、修正の機会があって読みやすさを考えて記述の修正だけをされたりしたら、逆戻りです。
なので、そのような記述をおこなう理由の説明も重要ということで。
oracle 優先ということならご存知かもしれませんが、以下参考に。
第9回 良いSQLについて
投稿2017/09/14 01:05
編集2017/09/14 01:56総合スコア25195
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/14 23:51
2017/09/17 07:18
2017/09/17 10:03
2017/09/18 02:09
2017/09/18 07:46
2017/09/21 23:26
2017/09/22 00:19
2017/09/24 23:46
0
大抵のDBエンジンは実行計画の最適化をするのでどうやっても内部的にはかわらないようです
Oracleはよくわかりませんが、たとえばMySQLなどだとテーブル同士の直接リレーションしない
データをorで検索する時若干処理効率がかわるようです
SQL
1select * from a inner join b on a.x=b.x and (a.y=1 or b.z=2); 2select * from a inner join b on a.x=b.x where a.y=1 or b.z=2;
まぁあまり想定されないような使い方なので気にすることはないと思います
投稿2017/09/14 01:05
総合スコア114843
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
実行結果は変わりますよ。
バグの元になっているのに気が付かないでいる人もいます。
外部結合におけるONとWHEREの違い
ON 句は結合条件、WHERE 句は抽出条件
投稿2017/09/13 21:13
総合スコア16415
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/13 22:37
2017/09/16 02:23
2017/09/17 07:15
0
実行計画に変わりがないことが前提
「実行結果に変わりがない」の間違いでしょうか?
条件をwhereまたはonにすることで実行計画が変わると思います。
経験上、MySQLではあまり使うことがないですが、PostgreSQLでは速度が劇的に改善することがあったような。
例えばテーブルAとBの1万件同士を結合して結果が10件のクエリを考えると
- AとBを結合した1万件のデータからwhere条件に一致する10件を抽出
- Bをonの条件で10件抽出してからAと結合
このような方法で抽出することが可能になるのではないでしょうか。後者のほうが速そうです。
投稿2017/09/13 11:30
総合スコア759
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/13 22:42
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/13 22:41