交叉联接
交叉联接是一种编写起来最简单的联接,但运行速度通常不是最快的,因为它们包含两个表中记录的所有可能组合。交叉联接不包含任何联接条件,它会返回笛卡尔积,其中结果集中的行数等于第一个表中的行数与第二个表中的行数之乘积。
以下查询返回了促销表和商店销售表的所有可能组合:
=> SELECT * FROM promotion_dimension CROSS JOIN store.store_sales_fact;
由于此示例返回了超过 6 亿个记录,因此,许多交叉联接的结果非常大,不易管理。但是,交叉联接非常有用,例如当您想返回一个单行结果集时。
提示
通过使用 WHERE
子句联接谓词过滤掉交叉联接中不需要的记录:
=> SELECT * FROM promotion_dimension p CROSS JOIN store.store_sales_fact f
WHERE p.promotion_key LIKE f.promotion_key;
隐式联接与显式联接
Vertica 建议您不要编写隐式交叉联接(FROM
子句中以逗号分隔的表)。这些查询可能会意外忽略了某个联接谓词。
以下查询隐式交叉联接 promotion_dimension
和 store.store_sales_fact
表:
=> SELECT * FROM promotion_dimension, store.store_sales_fact;
更好的做法是明确表达此交叉联接,如下所示:
=> SELECT * FROM promotion_dimension CROSS JOIN store.store_sales_fact;
示例
以下示例创建了两个小表格及其超投影,然后对这两个表运行交叉联接:
=> CREATE TABLE employee(employee_id INT, employee_fname VARCHAR(50));
=> CREATE TABLE department(dept_id INT, dept_name VARCHAR(50));
=> INSERT INTO employee VALUES (1, 'Andrew');
=> INSERT INTO employee VALUES (2, 'Priya');
=> INSERT INTO employee VALUES (3, 'Michelle');
=> INSERT INTO department VALUES (1, 'Engineering');
=> INSERT INTO department VALUES (2, 'QA');
=> SELECT * FROM employee CROSS JOIN department;
在结果集中,交叉联接检索了第一个表中的记录,然后为第二个表中每个行创建一个新行。接着,它对第一个表中的下一个记录重复此操作,依此类推。
employee_id | employee_name | dept_id | dept_name
-------------+---------------+---------+-----------
1 | Andrew | 1 | Engineering
2 | Priya | 1 | Engineering
3 | Michelle | 1 | Engineering
1 | Andrew | 2 | QA
2 | Priya | 2 | QA
3 | Michelle | 2 | QA
(6 rows)