Sql WHERE中的多个子查询

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

在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 = '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

为什么这会被否决?配置单元支持存在
的相关子查询。为什么会被否决?配置单元支持存在
的相关子查询。