0

重複の可能性:
明示的な SQL 結合と暗黙的な SQL 結合

Stmt1: SELECT ... FROM ((a JOIN b ON <cond1>) JOIN c ON <cond2>)

Stmt2: SELECT ... FROM a, b, c WHERE <cond1> AND <cond2>

2 番目のステートメントでより小さな結果セットが得られるかどうかはわかりません。A の 1 つの行に一致する B に複数の行がある場合、2 番目のステートメントでこれらすべての一致を取得できますか?

4

2 に答える 2

2

最終的な結果として、はい。実行に関して: クエリ オプティマイザーは、両方のクエリに対して同じクエリ実行プランを作成する可能性があります。

これは、おおよその統計 (たとえば、おおよその等深度ヒストグラム - ところで、常に最新であるとは限りません) に従って、最初の結合が最初の結合よりも選択的であるとオプティマイザが判断した場合に当てはまります。 2 番目のものであり、その結果、これが最初に実行されます。

Stmt1 を使用すると、結合の順序を指定できます。テーブルの内容が正確にわかっていることを考えると、これがより良い解決策になる可能性があります。

于 2012-07-11T17:12:49.233 に答える
1

意味的には、クエリは同一になります。ただし、これを証明するために計画に頼ろうとするのは得策ではありません。

また、クエリが 2 番目の形式では有効であるが、最初の形式では有効ではないような、任意の<cond1>andをドロップすることも可能です。<cond2>

その意味では、2 番目のほうがより一般的ですが、1 番目が優れている限り、2 番目も同等です。

于 2012-07-11T18:11:51.463 に答える