Home > pgsql > SQLの書き方をバックエンドに教えてもらう - その1

SQLの書き方をバックエンドに教えてもらう - その1

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 を使っている場合は このような書き換えはできません(続く)。

Writeback:0

Comment Form

writeback message: Ready to post a comment.

TrackBack ping me at
http://www.mono-space.net/blog/pgsql/e060516_subquery.trackback

Page Top