2011-02-03 1 views

答えて

7

パフォーマンス面で違いはありません。

私は、メンテナンス性のために第2の方法を推奨します。どの条件を使用してどのテーブルを結合するのがより明白であり、結合条件を逃したかどうかをより簡単に知ることができます。

+0

2番目の方法が好きな理由はありますか? –

+7

2番目の例はANSI-92の苦情ですが、最初の例はANSI-89に準拠しています... ANSI-92標準がより好ましい – Leslie

+3

パフォーマンスの差はないはずですが、Oracleが選択する妥当な数のバグがありますSQL 99の構文が使用されているときの不適切なクエリプラン(おそらく、外部結合の何らかの処理をしているとき)。 99.9%の時間で、違いはありませんが、ときどきあなたを噛んで跳ね上がることがあります(もちろん、それ以降のリリースではあまり頻繁ではありません)。 –

3

あなたのセカンドセレクトがselect a.acc, b.acc, c.acc from a JOIN b on a.acc=b.acc JOIN c on c.acc = a.acc;の場合は、違いはありません。

7

後者の構文を使用すると誤って結合条件が失われないようにするためにMarkのポイントに加えて、SQL 99の構文に関する素晴らしい点の1つは、列の命名規則では、親と子テーブルの試合では、あなたはすなわち

SELECT <<list of columns>> 
    FROM a JOIN b USING(acc) 
     JOIN c USING(acc) 

これは、コードの可読性を向上させることができ、ON句ではなく、USING句を使用して、うっかり間違ってテーブルを結合することにより、エラーを導入する確率を減らすことができます。私は、私は本当に

SELECT <<list of columns>> 
    FROM a, 
     a_to_b, 
     b 
WHERE a.a_id = a_to_b.a_id 
    AND b.b_id = a_to_b.b_id 

を意味するとき、私は誤って

SELECT <<list of columns>> 
    FROM a, 
     a_to_b, 
     b 
WHERE a.a_id = a_to_b.a_id 
    AND b.b_id = a_to_b.a_id -- a_to_b.**a_id** rather than a_to_b.**b_id** 

のようなものを書いたびにニッケルを持っていた場合、私は金持ちだろう。または、少なくとも十分な寿司の夕食に十分である。

ほとんどの場合、データが完全にねじれているため間違ったことをしたことはすぐに分かりますが、結果が十分に近いため、間違ったことをすぐには明らかにならないことがありますそれはあとでバグを見つけて、犯人クエリーを追跡するのはそれほど時間がかかりません。 USING句を使用してクエリを記述すると、基本的にはこの種の間違いをすることはできません。

SELECT <<list of columns>> 
    FROM a JOIN a_to_b USING (a_id) 
     JOIN b  USING (b_id) 
+0

SQLのフォーマットにはどのツールが使用されていますか? –

+0

@PaulVargas - 私はテーブルAとBを作成するのをやらなかったので、SQLをフォーマットするツールは使用しませんでした。私はちょうどそれをここに入力しました。 –

関連する問題