Impala SQL - Как решить исключение «Подзапросы в предикатах OR не поддерживаются» - PullRequest
0 голосов
/ 24 октября 2018

Например, у вас есть таблица, подобная приведенной ниже

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

Как решить эту проблему ИЛИ исключения?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вы можете разбить ваш запрос на 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'
0 голосов
/ 24 октября 2018

Если я правильно понимаю, вы можете использовать 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';
...