2011-12-05JOINの書き方3種

PostgreSQLはテーブルの結合 (ジョイン, JOIN) が得意です。ぶっちゃけ、JOINを使わないのであれば他のDBを使ったほうが良いと思っているくらいです。で、そんなJOINなのですが、書き方に流派がいくつかあるようです。以下のようなテーブルを考えて:
CREATE TABLE item (item_id integer, price integer); CREATE TABLE list (list_id integer, item_id integer, amount integer);
1. FROM にテーブルをならべて WHERE で条件を書く。Oracle流?
SELECT list_id, item.item_id, amount * price FROM item, list WHERE item.item_id = list.item_id
2. JOIN ~ ON 構文。実は括弧は要らない。
SELECT list_id, item.item_id, amount * price FROM item JOIN list ON item.item_id = list.item_id
3. JOIN ~ USING () 構文。こちらは括弧が必須。
SELECT list_id, item_id, amount * price FROM item JOIN list USING (item_id)
個人的には、3.がキータイプ数を減らせておススメ。「列名はテーブルを跨っても一意な名前を付ける必要がある」という制約もありますが、それはそれでミスを避けやすい気がします。また JOIN を使う 2 と 3 の書き方は、後から LEFT JOIN 等に変更する必要が出た場合でも、SQL文を大幅に書き換えずに済むのが地味に嬉しいです。ただ、SQL Server 等、USING が使えないDBもあるようなので、業界ではマイナーな書き方かもしれません。
SELECT list_id, item_id, amount * price
FROM item natural JOIN list
本文中の列名の制約を守ると、NATURAL JOIN はハマりどころが多そうですね。