【问题标题】:HIVE SubQuery expression refers to both Parent and SubQuery expressionsHIVE SubQuery 表达式同时引用 Parent 和 SubQuery 表达式
【发布时间】:2020-04-24 08:26:53
【问题描述】:

所以我有这个 HIVE 查询:

SELECT p.id 
FROM posts p JOIN
comments c ON c.postid = p.id JOIN
users u ON u.id = p.owneruserid JOIN
badges b ON b.userid = u.id CROSS JOIN
postlinks l 
WHERE l.relatedpostid > p.id
AND u.upvotes IN (SELECT MAX(upvotes) AS uv FROM users uu WHERE uu.creationdate > p.creationdate);

它给了我这个错误:

编译语句时出错:FAILED: SemanticException [Error 10249]:第 21:58 行不受支持的子查询表达式“创建日期”: SubQuery 表达式指的是 Parent 和 SubQuery 表达式,并且 不是有效的连接条件。

但我没有看到我的 SubQuery 表达式如何同时引用父查询和 SubQuery?!?

我专门使用user uuuser u 与父查询区分开来,在我的情况下,p.creationdate 必须与父查询相关。

正如post 中所述 HIVE 在子查询方面有一些限制:

  1. 这些子查询仅在表达式的右侧受支持。
  2. IN/NOT IN 子查询只能选择一个列。
  3. EXISTS/NOT EXISTS 必须有一个或多个相关谓词。
  4. 仅在子查询的 WHERE 子句中支持对父查询的引用。

但我看不出我是如何打破这些限制的。

我做错了什么?

感谢任何帮助。

编辑:

使用的数据是stackexchange数据的摘录。 所以帖子指的是stackexchange帖子等。

表格:

徽章(id,class,date,name,tagbased,userid)

cmets(id,creationdate,postid,score,text,userdisplayname,userid)

postlinks(id,creationdate,linktypeid,postid,relatedpostid)

帖子(id、acceptedanswerid、answercount、body、closeddate、commentcount、communityowneddate、creationdate、favoritecount、lastactivitydate、lasteditdate、lasteditordisplayname、lasteditoruserid、owner displayname、owneruserid、parentid、posttypeid、score、tags、标题,观看次数)

标签(id、count、excerptpostid、tagname、wikipostid)

用户(id、aboutme、accountid、创建日期、显示名称、downvotes、lastaccessdate、位置、profileimageurl、reputation、upvotes、views、websiteurl)

投票(id,bountyamount,creationdate,postid,userid,votetypeid)

我主要对如何写作感兴趣

SELECT p.id FROM posts p JOIN users u ON u.id = p.owneruserid
WHERE u.upvotes IN 
(SELECT MAX(upvotes) FROM users uu WHERE uu.creationdate > p.creationdate) 

这样它就不会给我这个错误。

【问题讨论】:

  • 我认为这与我的问题无关

标签: sql hive subquery hiveql


【解决方案1】:

如果你想要限制列表,你需要查看documentation。相关限制是:

引用父查询中的列的子查询谓词必须使用等于 (=) 谓词运算符。

子查询中没有相等子句。正如我在原始问题中提到的,您应该提出一个包含示例数据、期望结果以及代码应该做什么的解释的问题。

您查询中的两个麻烦比较都非常不寻常。通常,这种比较将具有相等比较。查询正在执行某事,并且可能有更好的方法来完成您想要的。只是不清楚你想要什么。

【讨论】:

  • 感谢您的回答,我已经更新了一些信息,所以对于以后的访问者来说可能会更清楚一些。
  • @DigitalJedi 。 . .您有一个问题,当前解决方案表示为查询。你应该问一个关于问题的新问题,而不是关于不工作的查询:你如何做 X?我不明白那段代码在做什么——毫无疑问是有意的,也许有用——但是根据 data 而不是 code 的解释可能会使可以回答这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
相关资源
最近更新 更多