【トラブル】【Oracle】エラー「ORA-01799: 列は副問合せに対して外部結合されません。」が表示される

■ はじめに

https://blogs.yahoo.co.jp/dk521123/37767007.html
で、以下の「エラーが発生したSQL」のようなSQLを実行したら、
エラー『ORA-01799: 列は副問合せに対して外部結合されません。』が表示された

■ エラー内容

SQL   : ORA-01799: 列は副問合せに対して外部結合されません。

エラーが発生したSQL


SELECT
 S2.YEAR AS PREV_YEAR,
 S1.YEAR AS YEAR,
 S2.SALE AS PREV_SALE,
 S1.SALE AS SALE,
 S1.SALE - S2.SALE  AS DIFF,
 CASE WHEN S1.SALE = S2.SALE THEN '→'
      WHEN S1.SALE > S2.SALE THEN '↑'
      WHEN S1.SALE < S2.SALE THEN '↓'
 ELSE '-' END AS UP_OR_DOWN
FROM
 SALES S1
LEFT OUTER JOIN
 SALES S2
ON
 S2.YEAR = (SELECT MAX(YEAR)
                    FROM SALES S3
                   WHERE S1.YEAR > S3.YEAR)
 ORDER BY YEAR

発生環境

 * OS : Windows10
 * DB : Oracle 11g

■ 原因

Oracle は、 外部結合するテーブルの結合条件に副問合せが使えない

■ 解決案

 * 「NOT EXISTS」を使う

SQL

SELECT
 S1.YEAR AS YEAR,
 CASE WHEN S1.SALE = S2.SALE THEN '→'
      WHEN S1.SALE > S2.SALE THEN '↑'
      WHEN S1.SALE < S2.SALE THEN '↓'
 ELSE '-' END AS UP_OR_DOWN,
 S1.SALE AS SALE,
 S2.SALE AS PREVIOUS_SALE,
 S1.SALE - S2.SALE AS DIFF
FROM
 SALES S1
LEFT OUTER JOIN
 SALES S2
ON
 S2.YEAR < S1.YEAR
 AND NOT EXISTS(SELECT 1 FROM SALES S3
  WHERE S3.YEAR > S2.YEAR AND S3.YEAR < S1.YEAR)
ORDER BY YEAR;