外联接

外联接扩展了内联接的功能。通过外联接,您可以保留一个或两个表中在非保留表中没有匹配行的行。外联接采用以下格式:

SELECT column‑list FROM left-join-table
[ LEFT | RIGHT | FULL ] OUTER JOIN right-join-table ON join-predicate

左外联接

左外联接返回左联接(保留)表 T1 的完整记录集以及右联接(非保留)表 T2 中的匹配记录(如适用)。如果 Vertica 未找到匹配项,它会使用 null 值扩展右侧列 (T2)。

=> SELECT * FROM T1 LEFT OUTER JOIN T2 ON T1.x = T2.x;

要排除 T2 中不匹配的值,请编写相同的左外联接,但使用 WHERE 子句过滤掉右表中不需要的记录:

=> SELECT * FROM T1 LEFT OUTER JOIN T2
   ON T1.x = T2.x WHERE T2.x IS NOT NULL;

以下示例使用左外联接扩充含有不完整电话号码维度的电话呼叫详细记录。然后,它过滤掉已知的不是来自马萨诸塞州的结果:

=> SELECT COUNT(*) FROM calls LEFT OUTER JOIN numbers
   ON calls.to_phone = numbers.phone WHERE NVL(numbers.state, '') <> 'MA';

右外联接

右外联接返回右联接(保留)表的完整记录集以及左联接(非保留)表中的匹配值。如果 Vertica 从左联接表 (T1) 中未找到匹配记录,则对于 T1 中没有匹配值的任何记录,将在 T1 列中显示 NULL 值。因此,右联接与左联接相似,只是用于联接的表的顺序相反而已。

=> SELECT * FROM T1 RIGHT OUTER JOIN T2 ON T1.x = T2.x;

上述查询等同于以下查询,其中 T1 RIGHT OUTER JOIN T2 = T2 LEFT OUTER JOIN T1

=> SELECT * FROM T2 LEFT OUTER JOIN T1 ON T2.x = T1.x;

以下示例会标识 没有 下单的客户:

=> SELECT customers.customer_id FROM orders RIGHT OUTER JOIN customers
   ON orders.customer_id = customers.customer_id
   GROUP BY customers.customer_id HAVING COUNT(orders.customer_id) = 0;

全外联接

全外联接返回左右两个外联接的结果。联接表包含两个表的所有记录,包括联接任何一侧中的 NULL(缺少匹配)。它非常有用,例如,如果您想查看哪些员工已分配到某个特定部门以及已有一名员工的所有部门,但是您还想查看哪些员工没有分配到某个特定部门以及没有员工的所有部门:

=> SELECT employee_last_name, hire_date FROM  employee_dimension emp
   FULL OUTER JOIN department dept ON emp.employee_key = dept.department_key;

注意

Vertica 还支持以下联接,即外部(保留)表或子查询在一个以上节点中进行复制,而内部(非保留)表或子查询跨多个节点进行分段。例如,在以下查询中,事实表(大多数情况下已分段)出现在联接的非保留表中,这是允许的:

=> SELECT sales_dollar_amount, transaction_type, customer_name
    FROM store.store_sales_fact f RIGHT JOIN customer_dimension d
   ON f.customer_key = d.customer_key;
 sales_dollar_amount | transaction_type | customer_name
---------------------+------------------+---------------
                 252 | purchase         | Inistar
                 363 | purchase         | Inistar
                 510 | purchase         | Inistar
                -276 | return           | Foodcorp
                 252 | purchase         | Foodcorp
                 195 | purchase         | Foodcorp
                 290 | purchase         | Foodcorp
                 222 | purchase         | Foodcorp
                     |                  | Foodgen
                     |                  | Goldcare
(10 rows)