编译语句时出错:FAILED:SemanticException [错误10002]

时间:2017-05-02 06:28:47

标签: mysql sql hadoop hive

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 [错误10002]:第4:11行无效的列引用' opr_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_type字段,所以即使第二个字段有效,但它花费的时间也多得多。 谁能帮我? 非常感谢!

2 个答案:

答案 0 :(得分:2)

您的第一个查询不起作用,因为在第一个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

您的第二个查询有效,因为在子查询中,您选择了dd.*)的所有列,因此当您按opr_time订购时,该列就会出现。 (与第三个查询相同)。

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

编辑:

根据Hive documentation

  

使用group by子句时,select语句只能包含   group by子句中包含的列。当然,你可以拥有   select语句中的许多聚合函数(例如count)   好。

所以,这个查询:

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

也不应该工作,因为select子句有一个额外的列(d.order_type),它不包含在group by子句中。

我希望这会有所帮助。

P.S。关于SQL执行顺序的This answer可能很有用。

答案 1 :(得分:0)

1。

Hive目前有order by限制 此问题的当前状态为PATCH AVAILABLE

见 -
"无法按未选择的列排序"
https://issues.apache.org/jira/browse/HIVE-15160

2

您可能希望熟悉LEFT SEMI JOINEXISTS是一种更清晰的语法 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins#LanguageManualJoins-JoinSyntax

3

可以使用min / max而非struct / named_struct代替order by ... asc / desclimit 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') 
;

P.S。

您真的要考虑将ID(user_idproduct_id)视为数字而不是字符串。