使用 ON 子句

使用 ON 子句来指定连接条件和任何表达式作为可选的连接过滤器。

下列来自 stores_demo 数据库的示例展示在 ON 子句中的连接条件如何组合 customerorders 表:
SELECT c.customer_num, c.company, c.phone, o.order_date
        FROM customer c LEFT JOIN orders o
        ON c.customer_num = o.customer_num;
下表展示连接了的 customerorders 表的一部分。
customer_num company phone order_date
101 All Sports Supplies 408-789-8075 05/21/2008
102 Sports Spot 415-822-1289 NULL
103 Phil’s Sports 415-328-4543 NULL
104 Play Ball! 415-368-1100 05/20/2008

在外连接中,您在 ON 子句中指定的连接过滤器(表达式)决定将从表的哪些行连接到主(或外)表。根据定义,主表返回在连接了的表中的所有行。即,在 ON 子句中的连接过滤器对主表不起作用。

如果 ON 子句在主表上指定连接过滤器,则数据库服务器仅将那些满足连接过滤器条件的主表行连接到从表中的行。连接的结果包含来自主表的所有行。那些不满足连接过滤器条件的主表中的行,为从列以 NULL 值扩展。

下列来自 stores_demo 数据库的示例展示 ON 子句中连接过滤器的作用:
SELECT c.customer_num, c.company, c.phone, o.order_date
        FROM customer c LEFT JOIN orders o
        ON c.customer_num = o.customer_num 
        AND c.company <> "All Sports Supplies";
包含 All Sports Supplies 的行保留在连接的结果中。
customer_num company phone order_date
101 All Sports Supplies 408-789-8075 NULL
102 Sports Spot 415-822-1289 NULL
103 Phil’s Sports 415-328-4543 NULL
104 Play Ball! 415-368-1100 05/20/2008

orders 表中,即使客户编号 101 的订单日期是 05/21/2008,放置连接过滤器(c.company <> "All Sports Supplies")的作用是阻止在主表 customer 中的此行被连接到从表 orders。相反,order_date 的 NULL 值会扩展到 All Sports Supplies 的行。

将连接过滤器应用到外连接的从部分中的基础表,可提升性能。要获取更多信息,请参阅您的 GBase 8s 性能指南