首页 > 解决方案 > 使用 JOIN 生成语法错误的 UNION ALL 子查询

问题描述

我正在尝试从 3 个表中获取数据,然后加入该结果集,如下所示:

SELECT     r.region, 
           r.recordtype,
           i.entity,
           COUNT(i.requestid) AS responses 
FROM       ( 
                  SELECT region, 
                         recordtype,
                         entity, 
                         requestid 
                  FROM   ( 
                                SELECT region, 
                                       'a' AS recordtype,
                                       requestid 
                                FROM   db.table1 
                                UNION ALL 
                                SELECT region, 
                                       'b' AS recordtype,
                                       requestid 
                                FROM   db.table2
                                UNION ALL 
                                SELECT region, 
                                       'c' AS recordtype,
                                       requestid 
                                FROM   db.table3 
                         ) union_results
           ) r 
RIGHT JOIN db.responses i 
ON         r.requestid = i.requestid 
GROUP BY   r.recordtype, 
           r.region,
           i.entity

我最终要寻找的是 i.requestid 在其他三个表的联合结果中的行的结果,然后按所示分组,虽然我什至不确定我是否正确使用 RIGHT JOIN 我得到基本查询出错。

请求表 1(a)

requestid  region
abcdef  us
bcdefg  eu
cdefgh  eu

请求表 2(b)

requestid  region
fghijk  eu
rstuwx  eu
jklmno  eu

请求表 3(c)

requestid  region
klmnop  eu
ghijkl  eu
opqrst  eu

回应

requestid  entity
abcdef  1
rstuwx  3
ghijkl  5
opqrst  5

结果

region  entity  recordtype  count(responses)
us  1  a  1
eu  3  b  1
eu  5  c  2

我成功地将联合作为子查询单独使用,但是当与连接配对时,我得到以下错误,所以我正在寻找关于我做错了什么的指针,我现在已经失明了。我使用中间表,因为最终计划是根据扩展数据在此处创建一些动态列(示例仅代表查询工作后我将最终提取的一些列)。

失败:ParseException 行 4:6 无法识别 joinSource 命令中的 '(' 'SELECT' 'region' 附近的输入,并以 ret '64' 退出

谢谢!

标签: sqlhivehiveql

解决方案


这个查询对我有用:

SELECT r.region, r.recordtype, entity, Count(responses.requestid) AS responses FROM
(SELECT region, "a" AS recordtype, requestid FROM Table1
 UNION ALL SELECT region, "b", requestid FROM Table2
 UNION ALL SELECT region, "c", requestid FROM Table3) AS r
RIGHT JOIN responses ON r.requestid=responses.requestid
GROUP BY recordtype, region, entity;

推荐阅读