编译语句时出错:failed:semanticexception[error 10002]

3htmauhk  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(4551)
select d.order_type from migu_td_aaa_order_log_d d where  exists(select 1 
from migu_user r where r.user_id = '156210106' and r.user_num = 
d.serv_number) and d.product_id in ('2028594290','2028596512','2028597138' ) 
order by d.opr_time desc limit 1

为什么上面的sql失败,表明:failed:semanticexception[error 10002]:第4行:11列引用“opr\u time”无效
但下面的方法是有效的:

select temp.order_type from (
select d.* from migu_td_aaa_order_log_d d where  exists(select 1 from 
migu_user r where r.user_id = '156210106' and r.user_num = d.serv_number) 
and d.product_id in ('2028594290','2028596512','2028597138' ) order by 
d.opr_time desc limit 1) temp;

这一个也很好,比第二个有效得多:

select d.* from migu_td_aaa_order_log_d d where  exists(select 1 from 
migu_user r where r.user_id = '156210106' and r.user_num = d.serv_number) 
and d.product_id in ('2028594290','2028596512','2028597138' ) 
order by d.opr_time desc limit 1

我只需要获得order\u type字段,所以尽管第二个字段可以工作,但它花费的时间要多得多。有人能帮我吗非常感谢

zlhcx6iw

zlhcx6iw1#

您的第一个查询不起作用,因为在第一个select语句中,您只得到一列( d.order_type ),但您正在尝试按另一列排序( d.opr_time ),您尚未将其包含在 select 陈述

select d.order_type from ...
...
order by d.opr_time desc limit 1

请注意,如果您添加了列 d.opr_time 对于第一个查询,它将起作用:

select d.order_type, d.opr_time from ...
...
order by d.opr_time desc limit 1

第二个查询之所以有效,是因为在子查询中,您选择了 d ( d.* ),所以当你按 opr_time ,该列存在(与第三个查询相同)。

select temp.order_type from (
select d.* ... order by d.opr_time ...

编辑时间:
根据hive文档:
使用GROUPBY子句时,select语句只能包含GROUPBY子句中包含的列。当然,在select语句中也可以有尽可能多的聚合函数(例如count)。
所以,这个查询:

select d.order_type, d.opr_time from ...
...
order by d.opr_time desc limit 1

也不应该起作用,因为select子句有一个附加列( d.order_type )不包括在GROUPBY子句中的。
我希望这有帮助。
p、 这个关于sql执行顺序的答案可能有用。

wf82jlnq

wf82jlnq2#

1.

配置单元当前有一个 order by 限制。
这个问题的现状是 PATCH AVAILABLE .
看到了吗-
“无法按未选定列排序”
https://issues.apache.org/jira/browse/hive-15160

2.

你可能想熟悉一下 LEFT SEMI JOIN 这是一个更干净的语法 EXISTS https://cwiki.apache.org/confluence/display/hive/languagemanual+joins#languagemanualjoins-连接语法

3.

使用 min / max 超过 struct / named_struct 可以用来代替 order by ... asc / desc 以及 limit 1 下面是另一种解决方案:

select      max(named_struct('opr_time',d.opr_time,'order_type',d.order_type)).order_type

from                        migu_td_aaa_order_log_d d 

            left semi join  migu_user               r 

            on              r.user_num  =  
                            d.serv_number 

                        and r.user_id   = '156210106' 

where       d.product_id in ('2028594290','2028596512','2028597138') 
;

附笔
你真的想考虑治疗身份证吗( user_id , product_id )作为数字而不是字符串。

相关问题