Выбор активных политик - PullRequest
       28

Выбор активных политик

0 голосов
/ 26 сентября 2019

У меня есть простой запрос, который объединяет две таблицы, как показано ниже:

select
p.policy_id, c.cust_name
from policies p
inner join customers c
on p.policy_id = c.policy_id

Однако мне нужно выполнить вышеупомянутый запрос только для политик 'Active' (т.е. is_Closed = 'N'), которыехранится в другой таблице -

Контракт:

policy_id | is_Closed
12345 | N
12345 | N
71567 | N
71567 | N
12345 | Y

Однако, взглянув на таблицу контрактов выше, мы видим, что policy_id 12345, хотя в ней 2 записи с 'N' (т.е.Active), но у него по-прежнему есть 1 запись, равная 'Y', что означает Closed.Для данного policy_id, если есть хотя бы одна запись с 'Y', она должна рассматриваться как Closed/Inactive независимо от того, существуют ли другие записи для этой политики, которые 'N' (то есть Active) и, следовательно, не должнырассматривается в выходных данных.
С другой стороны, политика 71567 имеет 2 записи, которые обе 'N', т.е. обе Active и, следовательно, должны учитываться для запроса.

Я пыталсячто-то вроде приведенного ниже запроса, чтобы игнорировать 'Closed' (то есть 'Y') политик -

select
p.policy_id, c.cust_name
from policies p
inner join customers c
on p.policy_id = c.policy_id
where p.policy_id NOT IN (select distinct policy_id from contract where is_Closed = 'Y');

Но, к сожалению, этот запрос занимает много времени с 125 Mil записями в таблице контрактов.Есть ли более разумный способ реализовать эту логику, чтобы она могла работать более эффективно?

Спасибо.

1 Ответ

0 голосов
/ 26 сентября 2019

Попробуйте предварительно агрегировать таблицу contracts:

select p.policy_id, c.cust_name
from policies p inner join
     customers c
     on p.policy_id = c.policy_id left join
     (select distinct policy_id
      from contract
      where is_Closed = 'Y'
     ) cy
     on p.policy_id cy.policy_id
where cy.policy_id is null;
...