FROM 子句中的子查询

SELECT ... FROM (subquery) name ...
SELECT ... FROM (subquery) AS name ...   (Note: Only valid starting with Hive 0.13.0)

Hive 仅在 FROM 子句中支持子查询(通过 Hive 0.12)。必须给子查询一个名称,因为 FROM 子句中的每个表都必须有一个名称。子查询选择列表中的列必须具有唯一的名称。子查询选择列表中的列在外部查询中可用,就像表的列一样。子查询也可以是带有 UNION 的查询表达式。 Hive 支持任意级别的子查询。

Hive 0.13.0 和更高版本(HIVE-6519)中的子查询名称之前可以包含可选关键字“ AS”。

简单子查询的示例:

SELECT col 
FROM (
  SELECT a+b AS col
  FROM t1
) t2

包含 UNION ALL 的子查询的示例:

SELECT t3.col
FROM (
  SELECT a+b AS col
  FROM t1
  UNION ALL
  SELECT c+d AS col
  FROM t2
) t3

WHERE 子句中的子查询

Hive 0.13开始,WHERE 子句支持某些类型的子查询。这些查询可以将查询结果视为 IN 和 NOT IN 语句的常量(称为* unorrelated 子查询*,因为该子查询未引用父查询中的列):

SELECT *
FROM A
WHERE A.a IN (SELECT foo FROM B);

其他受支持的类型是 EXISTS 和 NOT EXISTS 子查询:

SELECT A
FROM T1
WHERE EXISTS (SELECT B FROM T2 WHERE T1.X = T2.Y)

有一些限制:

  • 仅在表达式的右侧支持这些子查询。

  • IN/NOT IN 子查询只能选择一个列。

  • EXISTS/NOT EXISTS 必须具有一个或多个相关谓词。

  • 仅在子查询的 WHERE 子句中支持对父查询的引用。