所以我有一个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);
它给了我一个错误:
编译语句时出错:失败:semanticexception[error 10249]:第21行:58不支持的子查询表达式“creationdate”:子查询表达式同时引用父表达式和子查询表达式,并且不是有效的联接条件。
但是我不明白我的子查询表达式是如何同时引用父查询和子查询的?!?
我特别使用 user uu
区别 user u
在我的例子中,p.creationdate必须与父查询相关。
如本文所述,hive在子查询方面有一些限制:
这些子查询仅在表达式的右侧受支持。
in/not in子查询只能选择一列。
exists/not exists必须有一个或多个相关 predicate 。
对父查询的引用仅在子查询的where子句中受支持。
但我不明白我是如何打破这些限制的。
我做错什么了?
感谢您的帮助。
编辑:
使用的数据是stackexchange数据的摘录。所以把推荐信寄到交易所等。。
table:
徽章(id、class、date、name、tagbased、userid)
注解(id、creationdate、posted、score、text、userdisplayname、userid)
postlinks(id,creationdate,linktypeid,posted,relatedposted)
帖子(id、acceptedanswerid、answercount、body、closeddate、commentcount、communityowneddate、creationdate、favoritecount、lastactivitydate、lasteditdate、lasteditordisplayname、lasteditoruserid、ownerdisplayname、owneruserid、parentid、posttypeid、分数、标记、标题、viewcount)
标记(id、计数、摘录、标记名、wikipostid)
用户(id、aboutme、accountid、creationdate、displayname、downvotes、lastaccessdate、location、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)
所以它不会给我这个错误。
1条答案
按热度按时间7z5jn7bk1#
如果您想要限制列表,您需要查看文档。相关限制为:
引用父查询中的列的子查询 predicate 必须使用equals(=) predicate 运算符。
子查询中没有相等子句。正如我在最初的问题中提到的,您应该提出一个问题,包括示例数据、所需的结果以及代码应该做什么的解释。
在您的查询中,这两个麻烦的比较都是非常不寻常的。通常,这种比较会有一个平等的比较。查询正在做一些事情,可能有更好的方法来实现您想要的。只是不清楚你想要什么。