65

移行中の(一般化された) Oracle ベースのアプリケーションで次のものが見つかりました。

SELECT
    Table1.Category1,
    Table1.Category2,
    count(*) as Total,
    count(Tab2.Stat) AS Stat
FROM Table1, Table2
WHERE (Table1.PrimaryKey = Table2.ForeignKey(+))
GROUP BY Table1.Category1, Table1.Category2

(+)WHERE 句で何をしますか? 私はそれがそのように使用されているのを見たことがありません。

4

4 に答える 4

97

"=" のどちら側に "(+) があるかによって、LEFT OUTER または RIGHT OUTER 結合 (この場合は左外部結合) を示します。彼らはコードが短くなるのが好きなので、最初にそれを学びました。

ただし、読みやすさのために、使用しないことをお勧めします。

于 2009-01-10T00:46:45.453 に答える
25

他の人が述べているように、(+)構文は廃止された独自の構文であり、オラクルはOUTER JOIN. SQL-92 が標準構文を決定する前に、彼らは独自の構文を採用したと思います。

OUTER JOIN標準の SQL構文 (現在、すべての主要な RDBMS 実装でサポートされています)を使用した、示したものと同等のクエリは次のようになります。

SELECT
    Table1.Category1,
    Table1.Category2,
    COUNT(*) AS Total,
    COUNT(Table2.Stat) AS Stat
FROM Table1
  LEFT OUTER JOIN Table2 ON (Table1.PrimaryKey = Table2.ForeignKey)
GROUP BY Table1.Category1, Table1.Category2;

つまり:

  • のすべての行Table1がクエリ結果に含まれます。
  • に一致する行がある場合は、それらの行を含めます (に一致する行が複数ある場合は、 のTable2内容を繰り返します)。Table1Table2
  • に一致する行がない場合、クエリ結果のすべてのの列にTable2を使用します。NULLTable2
于 2009-01-10T00:52:50.853 に答える
5

非 ANSI 左外部結合表記です。Oracle9i 以降、'(+)' 表記を使用した紛らわしい外部結合構文は、ISO 99 外部結合構文に取って代わられました。

于 2009-01-10T00:42:18.363 に答える