Life Goes On

まあまあだけど楽しんでる方です

SQL で素数

素数を求める SQL というのがあります。
SQLで数学パズルを解く(数論編-問題)
念のため再掲すると、↓のように EXISTS を使います。

SELECT N1.num
  FROM Numbers N1
 WHERE NOT EXISTS (
    SELECT *
      FROM Numbers N2
     WHERE N2.num > 1
       AND N2.num <= N1.num/2
       AND MOD(N1.num, N2.num) = 0)
   AND N1.num > 1;

EXISTS を見たら、JOIN に書き換えたくなるのが人情。
という訳で書いてみたのですが、うまく動きません。
LEFT OUTER JOIN にしてるのに、INNER JOIN と同じ振る舞いになってしまい、最終行の条件(iS NULL)を除いても、約数を持つ数しか抽出されないのです。
何がいけないのかなぁ。

SELECT N1.num
  FROM Numbers N1
  LEFT OUTER JOIN Numbers N2
    ON MOD(N1.num, N2.num) = 0
 WHERE N1.num > 1
   AND N2.num > 1
   AND N2.num <= N1.num/2
   AND N2.num IS NULL;

なお OraclePostgreSQL で動作確認済みです。