非相关和相关的子查询
子查询可以分为以下两种类型:
-
非相关(简单)子查询获取结果不需要依赖其包含(外)语句。
-
相关子查询需要来自其外查询的值才能执行。
非相关子查询
非相关子查询的执行不需要依赖外查询。子查询首先执行,然后将结果传递给外查询,例如:
=> SELECT name, street, city, state FROM addresses WHERE state IN (SELECT state FROM states);
Vertica 按以下方式执行此查询:
-
执行子查询
SELECT state FROM states
(粗体)。 -
将子查询结果传递给外查询。
如果子查询解析为一个单行,查询的 WHERE
和 HAVING
子句可以指定非相关子句,如下所示:
在 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 按以下方式执行此查询:
-
子查询提取并评估外子查询记录中的每个
addresses.state
值。 -
然后,查询(使用 EXISTS 谓词)检查内部(相关)子查询中的地址。
-
由于它使用 EXISTS 谓词,因此查询会在找到第一个匹配项时停止处理。
Vertica 执行此查询时,会将完整查询转换为 JOIN WITH SIPS。