您好我正在尝试在Hive中运行此查询,但得到错误10249(不支持的查询表达式 - 仅支持1个子查询...)
select count(*) from
(
select * from tableA
union all
select * from tableB
) a
where a.field1 in (select fieldA in tableC)
or a.field2 in (select fieldA in tableC)
or a.field3 in (select fieldA in tableC);
有人会知道我怎么写这个,以便Hive支持这个查询(在SQL服务器上正常工作)
答案 0 :(得分:0)
在CTE中隐藏您的子查询,在where子句中保留连接和使用或条件。
IE。
with temp as
(
select * from tableA
union all
select * from tableB
)
select COUNT(a.*)
from temp a left join tableC a1 on a.field1 =a1.fieldA
left join tableC a2 on a.field2 =a2.fieldA
left join tableC a3 on a.field3 =a3.fieldA
where a1.fieldA is not null
or a3.fieldA is not null
or a3.fieldA is not null
答案 1 :(得分:0)
由于您不需要tableC
中的字段,因此您可以使用left semi join
代替in
:
select count(*) from
(
select * from tableA
union all
select * from tableB
) a
left semi join tableC c1 on a.field1=c1.fieldA
left semi join tableC c2 on a.field2=c2.fieldA
left semi join tableC c3 on a.field3=c3.fieldA
;
left semi join
是半连接,结果集仅包含来自其中一个连接表的字段,仅返回已连接的行,类似于内连接,但如果右表包含多个匹配行,则不会创建重复项。
LEFT SEMI JOIN以高效的方式实现不相关的IN / EXISTS子查询语义。