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;
なお Oracle と PostgreSQL で動作確認済みです。