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字段,所以尽管第二个字段可以工作,但它花费的时间要多得多。有人能帮我吗非常感谢
2条答案
按热度按时间zlhcx6iw1#
您的第一个查询不起作用,因为在第一个select语句中,您只得到一列(
d.order_type
),但您正在尝试按另一列排序(d.opr_time
),您尚未将其包含在select
陈述请注意,如果您添加了列
d.opr_time
对于第一个查询,它将起作用:第二个查询之所以有效,是因为在子查询中,您选择了
d
(d.*
),所以当你按opr_time
,该列存在(与第三个查询相同)。编辑时间:
根据hive文档:
使用GROUPBY子句时,select语句只能包含GROUPBY子句中包含的列。当然,在select语句中也可以有尽可能多的聚合函数(例如count)。
所以,这个查询:
也不应该起作用,因为select子句有一个附加列(
d.order_type
)不包括在GROUPBY子句中的。我希望这有帮助。
p、 这个关于sql执行顺序的答案可能有用。
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
下面是另一种解决方案:附笔
你真的想考虑治疗身份证吗(
user_id
,product_id
)作为数字而不是字符串。