使用子查询¶
子查询是另一个查询中的一个查询。FROM 或 WHERE 子查询用于提供数据,这些数据将用于限制或比较/评估包含查询返回的数据。
本主题内容:
子查询的类型¶
标量与非标量子查询¶
子查询也可分为 标量 子查询或 非标量 子查询:
标量子查询会返回单个值(一行一列)。如果没有符合返回条件的行,则子查询将返回 NULL。
非标量子查询会返回 0、1 或多行,每行可能包含 1 列或多列。对于每一列,如果没有要返回的值,则子查询将返回 NULL。如果没有符合返回条件的行,则子查询将返回 0 行(而非 NULLs)。
Snowflake 支持的类型¶
Snowflake 目前支持以下类型的子查询:
子查询运算符¶
借助 子查询运算符,可对嵌套查询表达式进行操作。它们可用于计算以下值:
标量子查询¶
标量子查询是最多返回一行的子查询。标量子查询可以出现在值表达式可以出现的任何位置,包括 SELECT 列表、 GROUP BY 子句,或者作为 WHERE 或 HAVING 子句中函数的实参。
使用说明¶
标量子查询在 SELECT 列表中只能包含一个项目。
如果标量子查询返回多行,则会生成运行时错误。
当前仅当相关标量子查询可以静态确定为返回一行时(例如,如果 SELECT 列表包含不带 GROUP BY 的聚合函数),相关标量子查询才能得到支持。
任何允许值表达式的地方都支持非相关标量子查询。
目前不支持在 FLATTEN 中具有相关性的子查询。
LIMIT / FETCH 子句只允许在非相关标量子查询中使用。
示例¶
此示例显示了 WHERE 子句中的基本非相关子查询:
SELECT employee_id FROM employees WHERE salary = (SELECT max(salary) FROM employees);
此示例显示了 FROM 子句中的非相关子查询;此基本子查询返回 international_GDP
表中信息的子集。总体查询列出了“高工资”国家/地区的工作,这些国家/地区的年薪与该国家/地区的 per_capita_GDP 相同。
SELECT p.name, p.annual_wage, p.country FROM pay AS p INNER JOIN (SELECT name, per_capita_GDP FROM international_GDP WHERE per_capita_GDP >= 10000.0) AS pcg ON pcg.per_capita_GDP = p.annual_wage AND p.country = pcg.name;
限制¶
尽管子查询可以包含各种 SELECT 语句,但它们存在以下限制:
某些子句不允许在 ANY/ALL/NOT EXISTS 子查询中使用。
唯一允许 LIMIT / FETCH 子句的子查询类型是非相关标量子查询。此外,由于非相关标量子查询仅会返回 1 行,因此 LIMIT 子句在子查询中几乎没有实际价值。