等联接和非等联接
Vertica 支持含有匹配列值和非匹配列值的任意联接表达式。例如:
SELECT * FROM fact JOIN dim ON fact.x = dim.x;
SELECT * FROM fact JOIN dim ON fact.x > dim.y;
SELECT * FROM fact JOIN dim ON fact.x <= dim.y;
SELECT * FROM fact JOIN dim ON fact.x <> dim.y;
SELECT * FROM fact JOIN dim ON fact.x <=> dim.y;
注意
=
和 <=>
运算符的运行速度通常是最快的。
等联接以等式(匹配列值)为基础。此等式以等于号 (=
) 表示,它在使用 SQL-92 语法的 ON
子句或使用更旧的联接语法的 WHERE
子句中用作比较运算符。
下文中第一个示例使用 SQL-92 和 ON
子句将线上销售额表与使用呼叫中心键的呼叫中心表联接在一起,然后查询返回等于 156 的销售日期键:
=> SELECT sale_date_key, cc_open_date FROM online_sales.online_sales_fact
INNER JOIN online_sales.call_center_dimension
ON (online_sales.online_sales_fact.call_center_key =
online_sales.call_center_dimension.call_center_key
AND sale_date_key = 156);
sale_date_key | cc_open_date
---------------+--------------
156 | 2005-08-12
(1 row)
第二个示例使用更旧的联接语法和 WHERE
子句联接上述表,获得了相同的结果:
=> SELECT sale_date_key, cc_open_date
FROM online_sales.online_sales_fact, online_sales.call_center_dimension
WHERE online_sales.online_sales_fact.call_center_key =
online_sales.call_center_dimension.call_center_key
AND sale_date_key = 156;
sale_date_key | cc_open_date
---------------+--------------
156 | 2005-08-12
(1 row)
Vertica 还允许使用包含复合(多列)主键和外键的表。例如,要创建一对包含多列键的表:
=> CREATE TABLE dimension(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL);=> ALTER TABLE dimension ADD PRIMARY KEY (pk1, pk2);
=> CREATE TABLE fact (fk1 INTEGER NOT NULL, fk2 INTEGER NOT NULL);
=> ALTER TABLE fact ADD FOREIGN KEY (fk1, fk2) REFERENCES dimension (pk1, pk2);
要联接使用复合键的表,您必须用 Boolean AND
运算符连接两个联接谓词。例如:
=> SELECT * FROM fact f JOIN dimension d ON f.fk1 = d.pk1 AND f.fk2 = d.pk2;
您可以通过含有 NULL=NULL
联接的 <=>
运算符的表达式编写查询。
=> SELECT * FROM fact JOIN dim ON fact.x <=> dim.y;
<=>
运算符与 =
运算符一样,执行等式比较,但它在两个操作数都为 NULL
时返回 true(而不是 NULL
),并在一个操作数为 NULL
时返回 false(而不是 NULL
)。
=> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
?column? | ?column? | ?column?
----------+----------+----------
t | t | f
(1 row)
比较 <=> 运算符和 = 运算符:
=> SELECT 1 = 1, NULL = NULL, 1 = NULL;
?column? | ?column? | ?column?
----------+----------+----------
t | |
(1 row)
注意
对主键/外键组合编写NULL=NULL
联接不是最佳选择,因为 PK/FK 列通常定义为 NOT NULL
。
编写联接时,它可帮助您提前知道哪些列包含 NULL 值。例如,员工的雇佣日期就不是一个好选择,因为雇佣日期不可能被忽略。但是,如果一些员工按小时领工资,而一些员工按薪水领工资,这种情况下,可以使用每小时工资列。如果您不确定给定表中的列值,而且希望检查一下,请键入以下命令:
=> SELECT COUNT(*) FROM tablename WHERE columnname IS NULL;