Impala SQL-如何解决';不支持或谓词中的子查询';例外

Impala SQL-如何解决';不支持或谓词中的子查询';例外,sql,impala,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     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分组,并具有大容量)

这在MySQL中有效,但在Impala中会出现异常

AnalysisException: Subqueries in OR predicates are not supported

如何解决此问题或异常问题

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

如果我理解正确,您可以使用
不存在

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';

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

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'

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

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'

嗨,瑜伽士,谢谢你的建议。您提供的第一种方法可以处理少量数据。如果数据复杂性越来越大,我们很难用相反的方式处理。第二种方法仍然会出现黑斑羚异常错误。嗨,瑜伽士,谢谢你的建议。您提供的第一种方法可以处理少量数据。如果数据复杂性越来越大,我们很难用相反的方式处理。第二种方法仍然会给出Impala异常错误。谢谢,hlagos!有一个打字错误,并已修复。你是对的,我也发现只有这个解决方案可以解决这个黑斑羚问题,但你可以用Union代替,Union都会提供副本!欢迎光临!如果第一个结果集排除b,则不确定如何获得重复项。您是对的!对于这个特定的示例,它不会得到重复的。但对于大量数据(例如,表中有额外的列,这些列具有相同的当前列数据,这可能会导致重复)。只是想知道,通常使用Union比使用Union all更安全吗?如果必须进行重复数据消除,它应该会更昂贵。根据数据的大小,它将需要几个网络和资源来影响查询库的性能,hlagos!有一个打字错误,并已修复。你是对的,我也发现只有这个解决方案可以解决这个黑斑羚问题,但你可以用Union代替,Union都会提供副本!欢迎光临!如果第一个结果集排除b,则不确定如何获得重复项。您是对的!对于这个特定的示例,它不会得到重复的。但对于大量数据(例如,表中有额外的列,这些列具有相同的当前列数据,这可能会导致重复)。只是想知道,通常使用Union比使用Union all更安全吗?如果必须进行重复数据消除,它应该会更昂贵。根据数据的大小,需要几个网络和资源来影响查询的性能