非相关和相关的子查询

子查询可以分为以下两种类型:

  • 非相关(简单)子查询获取结果不需要依赖其包含(外)语句。

  • 相关子查询需要来自其外查询的值才能执行。

非相关子查询

非相关子查询的执行不需要依赖外查询。子查询首先执行,然后将结果传递给外查询,例如:

=> SELECT name, street, city, state FROM addresses WHERE state IN (SELECT state FROM states);

Vertica 按以下方式执行此查询:

  1. 执行子查询 SELECT state FROM states(粗体)。

  2. 将子查询结果传递给外查询。

如果子查询解析为一个单行,查询的 WHEREHAVING 子句可以指定非相关子句,如下所示:

在 WHERE 子句中

=> SELECT COUNT(*) FROM SubQ1 WHERE SubQ1.a = (SELECT y from SubQ2);

在 HAVING 子句中

=> SELECT COUNT(*) FROM SubQ1 GROUP BY SubQ1.a HAVING SubQ1.a = (SubQ1.a & (SELECT y from SubQ2)

相关子查询

相关子查询通常在执行之前从外查询获取值。当子查询返回时,它将其结果传递给外查询。

在以下示例中,子查询需要外查询中 addresses.state 列的值。

=> SELECT name, street, city, state FROM addresses
     WHERE EXISTS (SELECT * FROM states WHERE states.state = addresses.state);

Vertica 按以下方式执行此查询:

  1. 子查询提取并评估外子查询记录中的每个 addresses.state 值。

  2. 然后,查询(使用 EXISTS 谓词)检查内部(相关)子查询中的地址。

  3. 由于它使用 EXISTS 谓词,因此查询会在找到第一个匹配项时停止处理。

Vertica 执行此查询时,会将完整查询转换为 JOIN WITH SIPS。