Impala SQL - 如何解决 'Subqueries in OR predicates are not supported' 异常

Impala SQL - How to solve 'Subqueries in OR predicates are not supported' exception

例如,您有如下 table

ID   TaskID    TaskName   Status       CaseID   
1     1         a         completed    101
1     2         a         pending      102
1     3         b         completed    103
1     4         c         completed    104

如果想得到输出table喜欢

ID TaskID TaskName Status     CaseID
1   4     c        completed  104
1   3     b        completed  103

可以用Impala SQL(真正的问题会按ID分组,体积大)

SELECT ID, TaskID, TaskName, Status, CaseID
FROM table 
WHERE TaskID in (select MAX(TaskID) OVER (PARTITION BY ID) from table)
   or TaskName = ‘b’

这在 MySQL 中有效,但在 Impala

中会出现异常
AnalysisException: Subqueries in OR predicates are not supported

如何解决这个 OR 异常问题?

如果我没理解错的话,你可以用not exists :

SELECT ID, TaskID, TaskName, Status, CaseID
FROM table t
WHERE Status = 'completed' AND
      NOT EXISTS (SELECT 1 FROM table t1 WHERE t1.TaskName = t.TaskName AND t1.Status = 'Pending');

如果我使用你的代码,那么我会使用相关子查询重写它:

SELECT ID, TaskID, TaskName, Status, CaseID
FROM table 
WHERE TaskID = (SELECT MAX(t1.TaskID) FROM table t1 WHERE t1.TaskName = t.TaskName) OR
      TaskName = 'c';

您可以将查询分解为 2 个查询并像这样合并结果以避免对子查询或谓词的限制

SELECT ID, TaskID, TaskName, Status, CaseID
FROM table 
WHERE TaskID in (select MAX(TaskID) OVER (PARTITION BY ID) from table where TaskName != 'b')
union all 
SELECT ID, TaskID, TaskName, Status, CaseID
FROM table 
WHERE TaskName = 'b'