我有这样的查询,并且显然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:选择列表中不支持子查询。
答案 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)
...