(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句で実行しますか?それがそのように使用されるのを見たことがありません。
「=」のどちら側が「(+)」であるかに応じて、LEFT OUTER結合またはRIGHT OUTER結合(この場合、左外部結合)を示します。これは古いOracle構文であり、彼らはコードを短くすることが好きなので、最初にそれを学びました。
ただし、読みやすくするために、使用しないことをお勧めします。
他の人が述べたように、(+)
構文は廃止された独自の構文であり、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
を使用します。これは、非ANSI左外部結合表記です。 Oracle9iから、「(+)」表記法を使用した混乱を招く外部結合構文は、ISO 99外部結合構文に置き換えられました。