web-dev-qa-db-ja.com

Oracle:WHERE句で `(+)`は何をしますか?

(generalized)を移行している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句で実行しますか?それがそのように使用されるのを見たことがありません。

55

「=」のどちら側が「(+)」であるかに応じて、LEFT OUTER結合またはRIGHT OUTER結合(この場合、左外部結合)を示します。これは古いOracle構文であり、彼らはコードを短くすることが好きなので、最初にそれを学びました。

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

89
SquareCog

他の人が述べたように、(+)構文は廃止された独自の構文であり、OUTER JOINと同じ結果を得るためにOracleが長年使用していました。 SQL-92が標準構文を決定する前に、独自の構文を採用したと思います。

標準のSQL OUTER JOIN構文(現在、すべての主要な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に一致する行がある場合、それらの行を含めます(Table1に一致する行が複数ある場合は、Table2からコンテンツを繰り返します)。
  • Table2に一致する行がない場合、クエリ結果のTable2のすべての列にNULLを使用します。
24
Bill Karwin

これは、非ANSI左外部結合表記です。 Oracle9iから、「(+)」表記法を使用した混乱を招く外部結合構文は、ISO 99外部結合構文に置き換えられました。

5
Otávio Décio