使用 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;
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 值扩展。
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";
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 性能指南 。