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'
例如,您有如下 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'