質問
3 つ以上のテーブルを共通の列で結合する場合、クエリは次のように記述します。
SELECT *
FROM a, b, c
WHERE a.id = b.id
AND b.id = c.id
最近同僚が私になぜ明示的にしなかったのかと尋ねました 推移的クロージャを結合する 私のクエリでは次のようになります:
SELECT *
FROM a, b, c
WHERE a.id = b.id
AND b.id = c.id
AND c.id = a.id
本当にこれに何かメリットがあるのでしょうか?オプティマイザー自体がこれを示唆できるでしょうか?
編集:これが悪質な構文であることは承知していますが、これは正当なレガシー コードの簡単で汚い例です +1 @スチュ それを掃除するために
解決
現在のデータベース エンジンではこれを行う必要はありませんが、そのようなことによりクエリ オプティマイザーに可能なインデックス パスに関するより多くのヒントが与えられ、結果がより高速に得られる時代がありました。
いずれにせよ、最近ではその構文全体が廃止されつつあります。
他のヒント
これは汚い、邪悪なレガシー構文です。これを次のように書きます
Select * -- Oh, and don't ever use *, either From A Inner Join B On A.ID = B.ID Inner Join C On B.ID = C.ID
いいえ、この構文は結合が言語に登場する前の時代に由来しています。それに関連する問題はわかりませんが、テーブルの結合に関してよりサポートされている言語構造が存在することは間違いありません。
ただ言いたいのは、この種の参加は悪魔の仕業だということです。
ちょっと考えてみてください。結合とフィルタリングの条件が where ステートメント内で混在します。
20 個のテーブルを結合し、15 個の値でフィルター処理する必要がある場合はどうなるでしょうか?
繰り返しますが、私の 0.02 ドルだけです
Microsoft SQL では、これら 2 つのクエリのクエリ プランは同一であり、同じ方法で実行されます。
数学的な観点から見ると、例は同じ結果をもたらすはずです。
a = b = c
したがって、最初の例では 2 番目の例と同じ結果が得られるため、追加の作業を行う必要はありません。
この質問は、非常に詳細な説明が記載されたこの質問と似ています。
簡単に言うと、推移的プロパティを明示的に宣言するとクエリが高速化される可能性があるということです。これは、クエリの最適化は簡単なタスクではなく、一部の SQL サーバーでは問題が発生する可能性があるためです。
この構文にも用途はありますが...場合によっては、複数のフィールドで 2 つのテーブルを結合する必要があることがわかります。