历史版本。 PostgreSQL 6.3 已结束支持。 请参阅 当前版本手册.
13.6. 类之间的连接
到目前为止,我们的查询一次只访问一个类。查询可以一次访问多个类,或者以某种方式访问同一个类,使得该类的多个实例同时被处理。一次访问同一个或不同类的多个实例的查询称为连接查询。例如,假设我们希望找出所有处于其他记录温度范围内的记录。实际上,我们需要把每个 EMP 实例的 temp_lo 和 temp_hi 属性与所有其他 EMP 实例的 temp_lo 和 temp_hi 属性进行比较。
注意
这只是一种概念模型。实际的连接可能以更高效的方式执行,但这对用户是不可见的。
我们可以用以下查询做到这一点:
SELECT W1.city, W1.temp_lo, W1.temp_hi,
W2.city, W2.temp_lo, W2.temp_hi
FROM weather W1, weather W2
WHERE W1.temp_lo < W2.temp_lo
AND W1.temp_hi > W2.temp_hi;
+--------------+---------+---------+---------------+---------+---------+
|city | temp_lo | temp_hi | city | temp_lo | temp_hi |
+--------------+---------+---------+---------------+---------+---------+
|San Francisco | 43 | 57 | San Francisco | 46 | 50 |
+--------------+---------+---------+---------------+---------+---------+
|San Francisco | 37 | 54 | San Francisco | 46 | 50 |
+--------------+---------+---------+---------------+---------+---------+
注意
这种连接的语义是:限定条件是为查询中指定的各类的笛卡尔积定义的真值表达式。对于笛卡尔积中限定条件为真的那些实例,Postgres 计算并返回选择列表中指定的值。Postgres SQL 不为此类表达式中的重复值赋予任何意义。这意味着
Postgres 有时会重复计算同一选择列表多次;当布尔表达式用
"or" 连接时经常发生这种情况。要去除此类重复,必须使用 select distinct 语句。
在本例中,W1 和 W2 都是类 weather 一个实例的代理(surrogate),二者都取遍该类的所有实例。(用大多数数据库系统的术语来说,W1 和 W2 被称为范围变量。)查询可以包含任意数量的类名和代理。