当我运行此查询时,它可以工作:
%hive
add jar /home/hadoop/jsonserde.jar
然而,当我运行这个时,我得到的SQL命令没有正确结束错误。请注意,唯一的区别是我给了子查询别名' sq1'。
select id1, count(*) from id_table
where id2 = 'X' and id1 in
(
select numA from num_table where numB = 'Y' and numC like '%Z%'
)
group by id1
order by count(*) desc;
我需要弄明白这一点,因为我试图加入一个子查询,因此需要一个别名来进行' on'子句。
有人可以解释为什么添加子查询别名会触发此错误吗?
答案 0 :(得分:0)
正如我和其他人在评论中提到的那样,问题在于你试图为派生表或列之外的其他东西设置别名。
想想你的代码:
WHRE id1 IN (SELECT numA FROM num_table) sql
与说法相同:
WHERE id1 IN (1,2,3,4) sql
这看起来不对,sql会出现什么样的别名? id1 IN (1,2,3,4)
的结果基本上是boolean of true or false
,它不是在查询的另一部分中引用的对象。
如果您将查询编写为连接,则实际上可以对表进行别名。
select
t.id1
,count(DISTINCT t.id1)
from
id_table t
INNER JOIN num_table sq1
ON t.id1 = sq1.numA
AND numB = 'Y'
and numC like '%Z%'
where t.id2 = 'X'
group by id1
order by count(DISTINCT t.id1) desc;
或者作为派生表
select
t.id1
,count(*)
from
id_table t
INNER JOIN (SELECT DISTINCT numA
FROM
num_table
WHERE
numB = 'Y'
and numC like '%Z%'
) sq1
ON t.id1 = sq1.numA
where t.id2 = 'X'
group by id1
order by count(*) desc;
如果id_table.id1是唯一的,这两个查询和你正在尝试OP的那个查询都会给你ID,1作为答案.......