Impala SQL-如何解决“不支持OR谓词中的子查询”异常

时间:2018-10-24 09:33:47

标签: sql impala

例如,您有一个如下表

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

如果要获取输出表,如

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异常问题?

2 个答案:

答案 0 :(得分:1)

您可以将您的查询分解为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'

答案 1 :(得分:0)

如果我理解正确,则可以使用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';