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字段,所以即使第二个字段有效,但它花费的时间也多得多。 谁能帮我? 非常感谢!
答案 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
您的第二个查询有效,因为在子查询中,您选择了d
(d.*
)的所有列,因此当您按opr_time
订购时,该列就会出现。 (与第三个查询相同)。
select temp.order_type from (
select d.* ... order by d.opr_time ...
编辑:
使用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)
Hive目前有order by
限制
此问题的当前状态为PATCH AVAILABLE
。
见 -
"无法按未选择的列排序"
https://issues.apache.org/jira/browse/HIVE-15160
您可能希望熟悉LEFT SEMI JOIN
,EXISTS
是一种更清晰的语法
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins#LanguageManualJoins-JoinSyntax
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')
;
P.S。
您真的要考虑将ID(user_id
,product_id
)视为数字而不是字符串。