PostgreSQL ユーザーズガイド
PrevChapter 9. 問い合わせ言語Next

クラスの結合

これまで問い合わせは一度にひとつのクラスにアクセスするものでした。 問い合わせは一度に複数のクラスにアクセスしたり、 同じクラスの中でも同じような方法で、 一度にクラスの複数のインスタンスを処理したりすることができます。 同じもしくは違うクラスからの複数のインスタンスに同時にアクセスする 問い合わせを結合の問い合わせと呼びます。 例として、他のレコードの気温の範囲にあるすべてのレコードを 探したいとしましょう。 実際には、 各 EMP インスタンスの最低気温と最高気温の属性を すべての他の EMP インスタンスの最低気温と最高気温の属性と 比較する必要があります。

NOTE: これは概念的なモデルです。 実際の結合はもっと効率的な方法で実行されますが、 これはユーザには見えないところです。

これは次のような問い合わせで行うことができます:
SELECT W1.街, W1.最低気温 AS 最低, W1.最高気温 AS 最高,
    W2.街, W2.最低気温 AS 最低, W2.最高気温 AS 最高
    FROM 天気 W1, 天気 W2
    WHERE W1.最低気温 < W2.最低気温
    AND W1.最高気温 > W2.最高気温;

+-----------------+------+------+------------------+------+------+
|街               | 最低 | 最高 | 街               | 最低 | 最高 |
+-----------------+------+------+------------------+------+------+
|サンフランシスコ | 43   | 57   | サンフランシスコ | 46   | 50   |
+-----------------+------+------+------------------+------+------+
|サンフランシスコ | 37   | 54   | サンフランシスコ | 46   | 50   |
+-----------------+------+------+------------------+------+------+

NOTE: このような結合の意味は、 制約句が問い合わせで示したクラスのデカルト積に定義された式が 真であるということです。 制約句が真であるデカルト積のインスタンスのために、 Postgres は ターゲットリストに指定された値を計算して返します。 Postgres SQLは そのような式の重複した値に何の意味も与えません。 これはPostgresが時に 同じターゲットリストを幾度か再計算することを意味します。 これはブール型の式が "or" でつながったときに度々起こります。 そのような重複を削除するには、 select distinct 文を使わなくてはなりません。

このケースで、W1 と W2 は両方とも天気クラスのインスタンスの代用で、 両方の範囲ともにクラスのすべてのインスタンスをまたいでいます。 (多くのデータベースシステム用語として、 W1 と W2 は 範囲変数として知られています。) 問い合わせには任意の数のクラス名と代用を含めることができます。


PrevHomeNext
SELECT 問い合わせの向け直しUp更新