联接条件与筛选条件

如果不使用 SQL-92 语法,联接条件(联接过程中评估的谓词)很难与筛选条件(联接之后评估的谓词)区分开来,而且在某些情况下根本无法表达。使用 SQL-92 时,联接条件和筛选条件会分为两个不同的子句,即 ON 子句和 WHERE 子句,这样查询更易于理解。

  • ON 子句 包含关系运算符(例如 <、<=、>、>=、<>、=、<=>)或用于指定合并左输入关系和右输入关系中哪些记录(例如通过匹配外键与主键)的其他谓词。ON 可用于内联接、左外联接、右外联接和全外联接。交叉联接和联合联接不能使用 ON 子句。

    内联接返回经 ON 子句评估为 TRUE 的左关系和右关系中的所有行对。在左联接中,联接中左关系的所有行出现在结果中;左关系与右关系中不匹配的行也会出现在结果中,但包含在右关系中获取的任何列中的 NULL。同样地,右联接会保留右关系的所有行,而全联接保留左右两个关系的所有行。

  • WHERE 子句 在联接执行之后进行评估。它会筛选 FROM 子句返回的记录,清除掉不符合 WHERE 子句条件的所有记录。

Vertica 自动将外联接转换为内联接(如果合适),允许优化器在更广泛的查询计划集中选择计划,从而实现更好的性能。