Sql WHERE中的多个子查询
在Cloudera5.8上尝试将以下查询从impala转换为Hive1.1时,我遇到了一些问题Sql WHERE中的多个子查询,sql,hadoop,hive,cloudera,Sql,Hadoop,Hive,Cloudera,在Cloudera5.8上尝试将以下查询从impala转换为Hive1.1时,我遇到了一些问题 SELECT * FROM table1 t1,table2 t2 WHERE concat(t1.field1, t1.field2) IN (SELECT concat(T3.field1, T3.field2) FROM table3 T3 WHERE T3.field3
SELECT *
FROM
table1 t1,table2 t2
WHERE concat(t1.field1, t1.field2) IN
(SELECT concat(T3.field1, T3.field2)
FROM table3 T3
WHERE T3.field3 = 'value')
AND concat(t1.field3, t1.field4) IN
(SELECT concat(T3.field1, T3.field2)
FROM table3 T3
WHERE T3.field3 = 'value')
AND t1.some_field = t2.some_field
我在这里得到的错误表明我不能在where子句中执行多个子查询
仅支持1个子查询表达式
我已尝试使用union
解决此问题,但在此版本中仅支持union-all
。我真的不确定如何使用连接来解决这个问题
如果您能就如何重写此查询提出建议,使其在不引发错误的情况下产生预期结果,我将不胜感激。他们的文档中说您可以使用CTE。 你能试试这个吗
WITH firstConcatResult AS (
SELECT * FROM
table1 t1,table2 t2
WHERE
//first concat
)
SELECT * FROM firstConcatResult f
WHERE
//other concat
他们的文件说你可以使用CTE。 你能试试这个吗
WITH firstConcatResult AS (
SELECT * FROM
table1 t1,table2 t2
WHERE
//first concat
)
SELECT * FROM firstConcatResult f
WHERE
//other concat
我会使用
exists
和适当的join
语法:
SELECT *
FROM table1 t1 JOIN
table2 t2
ON t1.some_field = t2.some_field
WHERE EXISTS (SELECT 1
FROM table3 T3
WHERE T3.field3 = 'value' AND
T3.field1 = t1.field1 AND t3.field2 = t1.field2
) AND
EXISTS (SELECT 1
FROM table3 T3
WHERE T3.field3 = 'value' AND
T3.field1 = t1.field3 AND t3.field2 = t1.field4
);
我会使用
exists
和适当的join
语法:
SELECT *
FROM table1 t1 JOIN
table2 t2
ON t1.some_field = t2.some_field
WHERE EXISTS (SELECT 1
FROM table3 T3
WHERE T3.field3 = 'value' AND
T3.field1 = t1.field1 AND t3.field2 = t1.field2
) AND
EXISTS (SELECT 1
FROM table3 T3
WHERE T3.field3 = 'value' AND
T3.field1 = t1.field3 AND t3.field2 = t1.field4
);
使用联接和CTE:
with s3 as (SELECT T3.field1, T3.field2
FROM table3 T3
WHERE T3.field3 = 'value')
SELECT *
FROM
table1 t1
inner join table2 t2 on t1.some_field = t2.some_field
left semi join s3 on t1.field1=s3.field1
and t1.field2=s3.field2
left semi join s3 on t1.field3=s3.field1
and t1.field4=s3.field2
使用联接和CTE:
with s3 as (SELECT T3.field1, T3.field2
FROM table3 T3
WHERE T3.field3 = 'value')
SELECT *
FROM
table1 t1
inner join table2 t2 on t1.some_field = t2.some_field
left semi join s3 on t1.field1=s3.field1
and t1.field2=s3.field2
left semi join s3 on t1.field3=s3.field1
and t1.field4=s3.field2
为什么这会被否决?配置单元支持存在
的相关子查询。为什么会被否决?配置单元支持存在的相关子查询。