4.7. テーブル間の結合

ここまで、問い合わせは一度に一つのテーブルのみにアクセスするだけで した。しかし、問い合わせは一度に複数のテーブルにアクセスすることが できますし、またテーブルの複数行が同時に処理されている場合において は同じテーブルにアクセスすることもできます。一回に同じもしくは異な るテーブルの複数行にアクセスする問い合わせは結合問い合わせと呼ばれ ます。例として、他のレコードの温度範囲にあるすべてのレコードを探し たいとします。実際にはすべての WEATHER テーブルの行の temp_lo と temp_hi カラムにともう一つの WEATHER テーブルの行の temp_lo と temp_hi カラムを比較する必要があります。

Note: これは概念モデルだけです。実際の結合はより効率的な方法において実 行されるかもしれませんが、これはユーザには見えません。

以下の問い合わせでこれを実行することができます。
SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high,
    W2.city, W2.temp_lo AS low, W2.temp_hi AS high
    FROM weather W1, weather W2
    WHERE W1.temp_lo < W2.temp_lo
    AND W1.temp_hi > W2.temp_hi;

+--------------+-----+------+---------------+-----+------+
|city          | low | high | city          | low | high |
+--------------+-----+------+---------------+-----+------+
|San Francisco | 43  | 57   | San Francisco | 46  | 50   |
+--------------+-----+------+---------------+-----+------+
|San Francisco | 37  | 54   | San Francisco | 46  | 50   |
+--------------+-----+------+---------------+-----+------+

Note: このような結合の意味論は、条件は問い合わせで指示したテーブルの直 積のために定義された式であるということです。条件が真である直積に に含まれる行に対して、Postgres はターゲットリストで指定される値 を計算して返します。Postgres SQL はこのような式において値が重複されること はありません。これはPostgres時々同じ ターゲットリストに数回のを再計算を行うからです。Boolean 演算子が 「or」と組み合わされるときしばしばこれが起こります。重複を取り除 くにはSELECT DISTINCT 文を使用しなければいけ ません。

この場合、W1W2のテーブルは weather テーブルの行とテーブルのすべての行を越えた両方の範囲の代わ りをするものです。(大部分のデータベースシステムの用語においては、 W1W2範囲変 数として知られています。)問い合わせは、任意の多くのテー ブル名と代理名を記述することができます。