Декорреляция подзапроса SQL с предикатом неравенства - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь декоррелировать запрос, который выглядит так:

select A.id, A.other_id A.data, A.data2, 
(select count(*) from B where B.id = A.id and B.data < A.data),
(select count(*) from B where B.id = A.id and B.data < A.data and A.other_id = B.other_id),
(select count(*) from B where B.id = A.id and B.data < A.data and B.sth is True)
from A

Я пытался что-то вроде select ... from A left join B on B.data < A.data where ... Но результат не совсем тот же, и он намного медленнее.

Есть ли разумный способ декоррелировать такой запрос?

Я хочу запустить это в искре, которая не поддерживает коррелированные подзапросы с предикатом неравенства.

Или, может быть, существует другой способ достижения того же результата, который будет работать с искрой.

1 Ответ

0 голосов
/ 20 декабря 2018

Вы можете заменить это условным агрегированием:

select A.id, A.other_id A.data, A.data2, 
       sum(case when b.data < a.data then 1 else 0 end),
       sum(case when b.other_id = a.other_idid and b.data < a.data then 1 else 0 end),
       sum(case when b.data < a.data and b.sth is true then 1 else 0 end)
from a left join
     b
     on a.id = b.id
group by A.id, A.other_id A.data, A.data2
...