(impala) AnalysisException: select 列表不支持子查询

(impala) AnalysisException: Subqueries are not supported in the select list

我有一个这样的查询,显然 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
...

您的查询有以下错误:

A​​nalysisException:select 列表不支持子查询。

你可以试试

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)

没有保证,我自己没试过。

通常,更简洁的解决方案是将子查询放入 FROM 子句中,从而通过内部或左联接将子查询链接到主 table。我通常在处理 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)         
...