- 2006-05-16
- pgsql
FROM 句に書くサブクエリは、外に出せる場合があります。 簡単な例だと SELECT * FROM (SELECT * FROM t) は SELECT * FROM t と一緒。 もうちょっとまともな例だと
-- 勝ち越した力士の名前と出身地
SELECT r.名前
, s.都道府県名
FROM 都道府県 s
,(SELECT *
FROM 力士
WHERE 勝ち星 >= 8) r
WHERE s.都道府県id = r.出身地id
-- サブクエリ内を外に出しても一緒
SELECT r.名前
, s.都道府県名
FROM 都道府県 s
, 力士 r
WHERE s.都道府県id = r.出身地id
AND r. 勝ち星 >= 8
例に深い意味はありません。こういう例考えるのってむずかしいね。 最初の単純な例にしろ、この力士の例にしろ、EXPLAIN すると 全く同じプランを出力します。つまり PostgreSQL はこの 2 つが同じ意味だと知っていて、サブクエリを外に出すという 書き換えを内部でやっています。
しかし、常に FROM 句のサブクエリは外に出せるわけではありません。 例えばサブクエリ内で LIMIT/OFFSET を使っている場合は このような書き換えはできません(続く)。