У меня есть запрос, который занимает довольно много времени, и я пытаюсь повысить его производительность. Он просматривает таблицу связей и находит ссылки на советника (которые могут быть либо начальным, либо конечным контактом). ...

1
Niamh 16 Фев 2021 в 15:03

2 ответа

Лучший ответ

Я думаю, вы можете переписать это в одно условие EXISTS:

select c2.first_name
from crm_contact c2
where c2.id <> 468 
  and exists (
    select *
    from crm_contact_linkages cl
    where cl.effective_to is null
      and cl.relationship = 'ADVISOR'
      and (cl.start_contact_entity = 468 or cl.ending_contact_entity = 468)
      and c2.id in (cl.start_contact_entity, cl.ending_contact_entity))

c2.id <> 468 кажется более подходящим для внешнего запроса, а не для подзапроса.

0
a_horse_with_no_name 16 Фев 2021 в 12:11

Это работает?

демонстрация: db <> скрипка

... 
WHERE c2.id = ANY(
    SELECT unnest(ARRAY[cl.start_contact_entity, cl.ending_contact_entity])
    FROM ...
)

Поместите оба столбца в массив и разложите его, чтобы создать один столбец, содержащий как начальное, так и конечное значение.

0
S-Man 16 Фев 2021 в 12:11
66223975