2016-12-07 302 views
1

我有这样的查询,并且显然Impala不支持SELECT语句中的子查询。我如何在Impala中整齐地重写它?(impala)AnalysisException:子查询在选择列表中不受支持

SELECT 
    col1, 
    col2, 
    ... 
    CASE 
    WHEN (SELECT 1 
      FROM 
      table1 x, 
      table2 y 
      WHERE 
      x.id = y.id 
      LIMIT 1) = 1 
    THEN 
     'A' 
    ELSE 
     'B' 
    END 
    coln 

FROM 
... 

你的查询有以下错误(S):

AnalysisException:子查询不在选择列表的支持。

回答

1

你可以尝试

SELECT col1, col2, ... 'A' coln 
    FROM ... 
    WHERE EXISTS (SELECT 1 FROM table1 x, table2 y WHERE x.id = y.id LIMIT 1) 
UNION ALL 
SELECT col1, col2, ... 'B' coln 
    FROM ... 
    WHERE NOT EXISTS (SELECT 1 FROM table1 x, table2 y WHERE x.id = y.id LIMIT 1) 

没有保证,还没有尝试过自己。

+0

谢谢,这个工程。尽管如此,我的实际上是一个非常大的查询,有多个子查询,并且这样做会让人感到害怕:)如果我没有错,它会花费额外的处理器时间。 – burakongun

+0

我自己没有检查过查询计划,但是你的例子中的子查询与主查询是独立的,因此我猜它只会被计算一次。如果你有一个依赖子查询,你可以使用一个连接,但最好的方法取决于实际的查询。 – Zoltan

0

通常,更干净的解决方案是将子查询放入FROM子句中,从而通过内连接或左连接将子查询链接到主表。在处理Impala中的复杂类型时,我通常会这样做。

但是,在您的具体示例中,您尝试执行左连接,为每行定义一个字段,指示连接是成功('A')还是不成功('B')。在这种情况下,你可以做到以下几点:

SELECT 
    x.id, x.col2, x.col3, ... 
    CASE 
    WHEN y.id IS NOT NULL THEN 'A' 
    ELSE 'B' 
    END 
    coln 
FROM table1 x LEFT JOIN 
    table2 y USING (id)   
...