Hatena::Grouppostgresql

PostgreSQL 雑記 このページをアンテナに追加 RSSフィード

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もあるようなので、業界ではマイナーな書き方かもしれません。

L_starL_star2011/12/06 18:204. natural join構文。ただしjoinしたいカラム(例の場合item_id)以外にカラム名重複が無いケースに限る。
SELECT list_id, item_id, amount * price
FROM item natural JOIN list

pgsqlpgsql2011/12/06 18:30そういえば NATURAL JOIN もありますね。想定外の動作をしそうで怖い気はしますが…

s87s872011/12/06 22:16面倒くさがって pgbench のテーブル同士を NATURAL JOIN したら filler 列まで JOIN に使われて、結局 2. の構文にした記憶が…
本文中の列名の制約を守ると、NATURAL JOIN はハマりどころが多そうですね。