4

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@ Stuの迅速で汚い例です

4

8 に答える 8

4

今日のデータベースエンジンではこれを行う必要はありませんが、そのようなことがクエリオプティマイザに可能なインデックスパスに関するより多くのヒントを与え、より迅速な結果をもたらす時代がありました。

最近、その構文全体がとにかく消えています。

于 2008-08-14T13:53:33.963 に答える
4

これは汚い、邪悪なレガシー構文です。あなたはこれを次のように書きます

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
于 2008-08-14T14:30:39.007 に答える
2

この構文は、結合がその言語で行われる前の時代に由来するものではありません。それに関連する問題はわかりませんが、テーブルの結合でよりサポートされている言語構造は間違いなくあります。

于 2008-08-14T13:46:23.790 に答える
1

数学的な観点から見ると、例でも同じ結果が得られるはずです。

a = b = c

したがって、最初の例では2番目の例と同じ結果が得られるため、余分な作業を行う必要はありません。

于 2008-08-14T13:48:30.777 に答える
1

この種の参加は悪魔の仕事だと言いたいだけです。
考えてみてください。結合とフィルタリングの条件は、whereステートメントで混合されます。
20個のテーブルを結合し、15個の値でフィルタリングする必要がある場合はどうなりますか?

繰り返しますが、私の$ .02

于 2008-08-14T13:50:39.430 に答える
1

Microsoft SQLでは、これら2つのクエリのクエリプランは同じです。同じ方法で実行されます。

于 2008-08-14T13:51:24.250 に答える
0

この質問は、非常に詳細な説明があるこの質問に似ています。

Joel Spolsky 記事からの SQL の質問

簡単に言えば、transiviv プロパティを明示的に宣言すると、クエリが高速化される可能性があるということです。これは、クエリの最適化は簡単な作業ではなく、一部の SQL サーバーでは問題が発生する可能性があるためです。

于 2009-02-06T11:10:02.300 に答える
-1

ただし、その構文には用途があります...複数のフィールドで2つのテーブルを結合する必要がある場合があります

于 2008-08-14T17:46:36.303 に答える