4

ANSI 構文と非 ANSI 構文のどちらが優れているかについての答えを見つけるために、多くの Web サイトに出くわしました。これら2つのクエリの違いは何ですか?

select a.name,a.empno,b.loc
from tab a, tab b
where a.deptno=b.deptno(+);

と:

select a.name,a.empno,b.loc
from tab a 
left outer join tab b on a.deptno=b.deptno;

どちらの場合も結果は同じです。2 番目のクエリも長くなります。どちらの方がよいですか?

結合する必要がある条件に基づいて、上記のクエリに別のテーブル Salgrade を追加したとしますか?? ..誰かが1つのテーブルを想定して説明してもらえますか

4

4 に答える 4

7

どちらの構文も通常は問題なく動作しますが、where 条件を追加しようとすると、2 番目の構文を使用すると、どれが結合条件でどれが where 句であるかを理解するのがはるかに簡単であることがわかります。

1)

  SELECT a.name,
         a.empno,
         b.loc 
    FROM tab a,
         tab b 
   WHERE a.deptno = b.deptno(+)
     AND a.empno = 190;

2)

         SELECT a.name,
                a.empno,
                b.loc 
           FROM tab a,
LEFT OUTER JOIN tab b 
             ON a.deptno = b.deptno
          WHERE a.empno = 190;

また、外部結合を認識するのがはるかに簡単で、(+) を含めることを忘れないでください。全体としては好みの問題だと言えますが、実際には、2 番目の構文の方がはるかに読みやすく、エラーが発生しにくいということです。

于 2013-11-11T11:27:25.877 に答える
1

1 つ目は結合を記述する従来の Oracle 固有の方法であり、2 つ目は ANSI SQL-92+ 標準であり、推奨される方法です。

于 2013-11-11T11:26:20.060 に答える
1

私を含め、何度も徹底的に議論しました。

(外部結合であるかどうかに関係なく) 暗黙的ではなく明示的な JOIN を使用すると、暗黙的な結合を使用してデカルト積を誤って作成することがはるかに簡単になります。

明示的な JOIN を使用すると、「偶然に」JOIN を作成することはできません。関係するテーブルが多いほど、1 つの結合条件を見逃すリスクが高くなります。

基本的に (+) は、ANSI 結合に比べて大幅に制限されています。さらに、ANSI 結合構文はすべての主要な DBMS でサポートされているのに対し、Oracle でのみ使用できます。

ANSI 構文に移行した後、SQL のパフォーマンスが向上するわけではありません。構文が異なるだけです。

前の例に示した、より柔軟な FROM 句の結合構文を使用することを強くお勧めします。過去に ANSI 構文にいくつかのバグがありましたが、最新の 11.2 または 12.1 を使用する場合は、既に修正されているはずです。

JOIN 演算子を使用すると、SQL コードが ANSI 準拠であることを確認できるため、フロントエンド アプリケーションを他のデータベース プラットフォームに簡単に移植できます。

結合条件では、各テーブルの選択性が非常に低く、理論上の外積のタプルの選択性が高くなります。where ステートメントの条件は、通常、はるかに高い選択性を持っています。

Oracle は内部的に ANSI 構文を (+) 構文に変換します。これは、実行計画の述語情報セクションで確認できます。

11.2 を使用している場合は、ANSI に参加することをお勧めします。12C を使用すると、OUTER JOINS でいくつかの新しいバグが発見されました。

また、11.2 で修正された 11.2 より前の ANSI 構文を使用しているときに、Oracle にいくつかのバグがあったことも覚えています。

私の意見では、私は ANSI 構文の大ファンではありません。Oracle は ANSI の標準を確認していますが、完全にバグがないわけではありません。

于 2013-11-11T11:26:28.110 に答える
0

結合については、この記事をお読みください。AテーブルではなくBテーブルにデータがある場合、例の結果は同じではありません

于 2013-11-11T11:33:36.900 に答える