自然联接
自然联接只是一种包含隐式联接谓词的联接。自然联接可以是内联接、左外联接、右外联接或全外联接,它采用以下格式:
SELECT column‑list FROM left-join-table
NATURAL [ INNER | LEFT OUTER | RIGHT OUTER | FULL OUTER ] JOIN right-join-table
默认情况下,自然联接为自然内联接;但自然联接也可以为自然左/右/全外联接。内联接和自然联接的主要区别在于,内联接具有显式联接条件,而自然联接的条件的形成方式是,对具有相同名称和兼容数据类型的表中所有列对进行匹配,使自然联接变为等联接,因为联接条件在普通的列之间是相等的。(如数据类型不兼容,Vertica 将返回错误。)
注意
数据类型强制转换表列出了哪些数据类型可以转换为其他数据类型。如果一种数据类型可转换为其他数据类型,则这两种数据类型兼容。当 T2 列 val
大于 5 时,以下查询是 T1 表和 T2 表之间的一个简单的自然联接:
=> SELECT * FROM T1 NATURAL JOIN T2 WHERE T2.val > 5;
store_sales_fact
表和 product_dimension
表有两列共享相同的名称和数据类型:product_key
和 product_version
。以下示例在这两个表的共享列处创建自然联接:
=> SELECT product_description, sales_quantity FROM store.store_sales_fact
NATURAL JOIN public.product_dimension;
以下三个查询返回相同的结果,分别表示为基本查询、内联接和自然联接。仅当 store_sales_fact
表和 store_dimension
表中的公共属性为 store_key
时,表的表达式才等效。如果两个表都具有名为 store_key
的列,则自然联接也会具有 store_sales_fact.store_key = store_dimension.store_key
联接条件。由于所有三个实例的结果都相同,因此它们仅显示在第一个(基本)查询中:
=> SELECT store_name FROM store.store_sales_fact, store.store_dimension
WHERE store.store_sales_fact.store_key = store.store_dimension.store_key
AND store.store_dimension.store_state = 'MA' ORDER BY store_name;
store_name
------------
Store11
Store128
Store178
Store66
Store8
Store90
(6 rows)
作为内联接编写的查询:
=> SELECT store_name FROM store.store_sales_fact
INNER JOIN store.store_dimension
ON (store.store_sales_fact.store_key = store.store_dimension.store_key)
WHERE store.store_dimension.store_state = 'MA' ORDER BY store_name;
对于自然联接,通过对由相同的列名称联接的两个表中所有列进行比较,隐式显示联接谓词。结果集对表示一对命名相同的列仅保留一列。
=> SELECT store_name FROM store.store_sales_fact
NATURAL JOIN store.store_dimension
WHERE store.store_dimension.store_state = 'MA' ORDER BY store_name;