不支持的子查询表达式“时尚”:子查询表达式仅引用外部查询表达式

Posted

技术标签:

【中文标题】不支持的子查询表达式“时尚”:子查询表达式仅引用外部查询表达式【英文标题】:Unsupported SubQuery Expression ''Fashion'': SubQuery expression refers to Outer query expressions only 【发布时间】:2018-09-05 16:35:45 【问题描述】:

我正在使用以下查询:

select UserId, Category from customer_data 
where (Category in ('Fashion','Electronics'))
and (Action in ('Click','AddToCart','Purchase'))
and customer_data.UserId not in (select ustomer_data.UserId from customer_data where customer_data.Category='Fashion' and customer_data.Category='Electronics')  ;

出现以下错误:

hive> Unsupported SubQuery Expression ''Fashion'': SubQuery expression refers to Outer query expressions only.

我不确定这个错误,我是否还需要在外部查询中为每个 cloumn 使用表名,如 customer_data.Category? 你能帮忙吗?

样本数据:

UserId,ProductId,Category,Action
1,111,Electronics,Browse
2,112,Fashion,Click
3,113,Kids,AddtoCart
4,114,Food,Purchase
5,115,Books,Logout
6,114,Food,Click
7,113,Kids,AddtoCart
8,115,Books,Purchase
9,111,Electronics,Click
10,112,Fashion,Purchase
3,112,Fashion,Click
12,113,Kids,AddtoCart

想要的输出:

Output File
•   userID
•   category

【问题讨论】:

为什么答案会被删除? 是的,但我的问题陈述是:生成对“时尚”类别或“电子”类别感兴趣但对这两个类别都不感兴趣的用户列表。用户是否对他/她执行了任何这些操作(单击/添加到购物车/购买)感兴趣。所以我需要在两个类别条件下都满足这一点 同一记录的一列不能等于两个不同的值。这就是为什么这个条件customer_data.Category='Fashion' and customer_data.Category='Electronics'没有意义。看来您根本不需要该子查询。请提供数据示例和所需的输出 示例数据:UserId,ProductId,Cat​​egory,Action 1,111,Electronics,Browse 2,112,Fashion,Click 3,113,Kids,AddtoCart 4,114,Food,Purchase 5,115,Books,Logout 6,114,Food,Click 7,113, Kids,AddtoCart 所需的输出:输出文件 • 用户ID • 类别问题陈述:生成对“时尚”类别或“电子”类别感兴趣但对这两个类别都不感兴趣的用户列表。用户是否对他/她执行了任何这些操作(点击/添加到购物车/购买)感兴趣。 我已经编辑了问题,你能检查一下吗? 【参考方案1】:

使用分析函数计算每个 UserId 的 fashion_flag:

select UserId, Category
from
( --calculate User level flags
select UserId, Category,
       max(fashion_flag)     over (partition by UserId) as user_fashion_flag,
       max(electronics_flag) over (partition by UserId) as user_electronics_flag
from
(--maybe you do not need this subquery, if case will work inside max() over
    select UserId, Category,
           case when Category='Fashion'     then 1 else 0 end fashion_flag,
           case when Category='Electronics' then 1 else 0 end electronics_flag
      from customer_data 
     where (Category in ('Fashion','Electronics'))
       and (Action in ('Click','AddToCart','Purchase'))
) s

) s
where user_fashion_flag+user_electronics_flag=1 --not allow two flags at a time
;

【讨论】:

以上是关于不支持的子查询表达式“时尚”:子查询表达式仅引用外部查询表达式的主要内容,如果未能解决你的问题,请参考以下文章

只允许作为***合取的 SubQuery 表达式

HIVE WHERE NOT EXISTS 不比较 NULLS

SQL Server 之 子查询与嵌套查询

Postgresql - 使用带有改变序列表达式的子查询

Django - 用作表达式的子查询返回的不止一行

Oracle-视图,约束