(impala)AnalysisException:选择列表中不支持子查询

时间:2016-12-07 13:52:10

标签: select subquery impala

我有这样的查询,并且显然Impala不支持SELECT语句中的子查询。我怎样才能在Impala中巧妙地重写它?

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
...

您的查询有以下错误:

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

2 个答案:

答案 0 :(得分: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)

没有保证,没有亲自尝试过。

答案 1 :(得分:0)

通常,更简洁的解决方案是将子查询放入FROM子句,从而通过内部或左侧连接将子查询链接到主表。我通常在处理Impala中的复杂类型时执行此操作。

但是,在您的具体示例中,您尝试进行左连接,为每一行定义一个字段,指示连接是否成功(' A')或不是(' B&# 39)。在这种情况下,您可以执行以下操作:

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)         
...