带有多个子查询的 SQL 错误 10249 Hive

Posted

技术标签:

【中文标题】带有多个子查询的 SQL 错误 10249 Hive【英文标题】:SQL Error 10249 Hive with multiple subqueries 【发布时间】:2019-01-15 06:33:35 【问题描述】:

我试图在 where 子句中运行多个子查询,但出现以下错误。是否意味着 Hive 不支持它?如果没有,是否有不同的方式来编写下面的查询?

如果我这样写代码:

SELECT * 
FROM ide_test.flights 
WHERE carrier_code IN
(
SELECT carrier_code 
FROM ide_test.flights
WHERE year >1
);

我会得到

[错误 10249]:第 6:12 行不支持子查询表达式'carrier_code':子查询不能使用表别名:航班;这也是外部查询中的别名,子查询包含不合格的列引用

如果我这样写,请在子查询或外部查询表的名称之外添加一个“s”:

SELECT * 
FROM ide_test.flights 
WHERE carrier_code IN
(
SELECT carrier_code 
FROM ide_test.flights s
WHERE year >1
);

or

SELECT * 
FROM ide_test.flights s
WHERE carrier_code IN
(
SELECT carrier_code 
FROM ide_test.flights
WHERE year >1
);

然后就成功了

【问题讨论】:

【参考方案1】:

您可以尝试使用相关子查询

  SELECT a.* 
  FROM ide_test.flights a
  where exists (SELECT 1
  FROM ide_test.flights a1
  WHERE a1.carrier_code=a.carrier_code
  and  carrier_code <>1
                )

【讨论】:

【参考方案2】:

你也可以不使用IN子查询,使用解析函数,这个查询只会扫描表一次:

select s.* --list columns here
from
    (
     select f.*, 
            count(case when year >1 then 1 end) over(partition by carrier_code) cnt 
       from ide_test.flights f
    )s
where cnt>=1
;

【讨论】:

【参考方案3】:

似乎 hive sql 解析器无法识别相同的表 IN/NOT IN 子句,除非使用别名作为表名。

【讨论】:

以上是关于带有多个子查询的 SQL 错误 10249 Hive的主要内容,如果未能解决你的问题,请参考以下文章

带有“exists”子句和多个表的 SQL 子查询

带有子查询的 SQL 多个聚合函数

带有子查询的 redshift sql 查询中的语法错误

带有子查询的 SQL 查询上的 MS Access VBA 运行时错误 3075

带有子查询排除的 SQL 选择字段

如何优化此 SQL Server 查询 - 多个子查询