7

私はオラクルの選択を移植してきました、そして私は次のような多くのクエリに出くわしました:

SELECT e.last_name,
       d.department_name
  FROM employees e,
      departments d
WHERE e.department_id(+) = d.department_id;

...と:

SELECT last_name, 
       d.department_id
  FROM employees e, 
       departments d
 WHERE e.department_id = d.department_id(+);

(+)構文のすべてのバリアントを変換するためのガイド/チュートリアルはありますか?その構文は何と呼ばれていますか(私はグーグルを精査することができます)?

さらに良い..私のためにこの変換を行うツール/スクリプトはありますか(無料を推奨)?ある種のオプティマイザー?移植するこれらのクエリは約500あります。

この標準はいつ段階的に廃止されましたか?どんな情報でも大歓迎です。

4

6 に答える 6

22

ANSI-89構文はサポート用の構文を提供しないため、これ(+)はOracle固有のANSI-92以前のOUTERJOIN構文です。OUTER JOIN

それがどのテーブルと列の参照であるかによって決定されるかどうかは、表記が付加されRIGHTます。句LEFTの最初のテーブルに関連付けられている列の横に指定されている場合、それは結合です。そうでなければ、それは結合です。 これは、JOINの違いを知る必要がある人にとっては良いリファレンスですFROMRIGHTLEFT

ANSI-92構文を使用して書き直された最初のクエリ:

    SELECT e.lastname,
           d.department_name
      FROM EMPLOYEES e
RIGHT JOIN DEPARTMENTS d ON d.departmentid = e.departmentid

ANSI-92構文を使用して書き直された2番目のクエリ:

   SELECT e.lastname,
          d.department_name
     FROM EMPLOYEES e
LEFT JOIN DEPARTMENTS d ON d.departmentid = e.departmentid
于 2010-03-11T15:45:56.923 に答える
3

Googleの「Oracle結合構文」。これ(+)は、さまざまなフレーバーの外部結合に使用されます。最初に示したのは左外部結合で、2番目は右外部結合だと思います。私はこの表記法をしばらく見ていなかったので、少し離れている可能性がありますが、うまくいけば、これはあなたにグーグルを打って正しい答えを得るのに十分な情報を与えるでしょう。

アップデート:

それで、あなたはあなたのためにそれをするためのツールが欲しいですか?SwisSQLはこのようなことを実行できると聞きましたが、ほとんどのクエリが十分に単純な場合は、それを実行する小さなスクリプトを作成できる可能性があります。OMG Poniesの回答は、古い構文から新しい構文に変換するためのパターンをうまく示しています。

于 2010-03-11T15:00:20.680 に答える
2

これは、次のような単純な状況でもWHERE句として非常に複雑になる可能性があります。

WHERE e.id = d.manager_id(+) OR e.id = d.contact_id(+)

UNIONまたは副選択クエリに変換されます。

Pythonが好きなら、sqlparseを見てみると、有望に見え、必要なこととSQLコードの再フォーマットを実行できる可能性があります。ソース上で直接簡単に機能します。あなたはそれに何をすべきかを言わなければならないでしょう、しかしそれはあなたが退屈な構文解析部分を書くことからあなたを解放します。

于 2010-03-19T16:21:40.217 に答える
1

Oracle10gの場合

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/queries006.htm#i2054012

バージョンが異なる場合は、他のバージョンのOracleマニュアルをオンラインで見つけることができますが、結合構文はおそらく異なりません。

于 2010-03-11T15:06:33.973 に答える
1

Oracle 8iから9iへの移行でこの構文がなくなったことを覚えているようです-すべてを変換することになったヒキガエルプラグインがあったので、すべてのクエリを実行する時間を無駄にする必要はありませんでした

于 2010-03-12T19:12:33.480 に答える
1

自動的に変換を行うツールはわかりませんが、たとえあったとしても、とにかくケースバイケースで変更を確認することをお勧めします。したがって、ツールで時間を大幅に節約できるとは思いません。

http://www.dba-oracle.com/oracle_news/2004_2_19_rittman.htmによると:

従来の結合ではなくANSI結合を使用しても、パフォーマンス上の利点や打撃はありませんが、ANSI結合を使用すると、DBMSプラットフォーム間でクエリの移植性が高まり、少し読みやすくなります。結局のところ、それは個人的な好み次第であり、ANSI規格には利点がありますが、必要がない場合は切り替える必要はありません。

また、どこでもいずれかのスタイルを使用する必要はありません。コードを一度に1つのクエリに変換できますが、すべてが機能し続けることがある程度保証されています。クエリはそのままにして、新しいコードでANSISQL-92構文を使用するように解決します。

于 2010-03-19T21:38:01.883 に答える