带有多个子查询的 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的主要内容,如果未能解决你的问题,请参考以下文章