SQL запрос logi c, чтобы получить идентификаторы, у которых IsActive false для всех возможных иерархий - PullRequest
0 голосов
/ 10 июля 2020

Окончательный результат не должен включать идентификатор 24, поскольку этот идентификатор имеет активное сопоставление с иерархией компании: 1176-> 1781-> 1787 И 1787 активен во второй таблице. Запрос, который я попробовал, не смог получить желаемый результат.

Примеры данных:

Table 1 #tempCTE_CompMCompDir: 

Id  CompanyId   ChildId
24  1776        1781
24  1776        1782
25  1777        1783
24  1781        1786
24  1781        1787

Table 2 #tempContComM:
CompanyId   ContactId   IsActive
1787            2903    1
1783            2903    0
1778            2903    0
1786            2903    0

Входные данные:

  1. Таблица 1 содержит иерархические данные Компании и дочерние компании.

  2. В таблице 2 есть компании конечного уровня с IsActive true или false.

Вывод:

  • Получить все идентификаторы из таблицы 1

Если идентификатор компании или дочерний идентификатор из таблицы 1 сопоставлен с идентификатором компании таблицы 2 через иерархию И IsActive для этого сопоставления является ложным во всех случаях.

Вывод для демонстрационных данных должен быть:

Id
25

Мой запрос с неверным выводом:

SELECT CTE_CompMCompDir.Id
    FROM #tempCTE_CompMCompDir  CTE_CompMCompDir
    JOIN #tempContComM          tempContComM
        ON   ( CTE_CompMCompDir.CompanyId  = tempContComM.CompanyId 
                    AND tempContComM.IsActive = 0)
            OR ( CTE_CompMCompDir.ChildId     = tempContComM.CompanyId
                    AND tempContComM.IsActive = 0) 
    

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Этот запрос отбрасывает все # tempCTE_CompMCompDir.Id, где CompanyId или ChildId совпадает с необработанным, где IsActive = 1, во вторую таблицу; это мое понимание того, чего вы пытаетесь достичь

select T1.Id
from #tempCTE_CompMCompDir T1
inner join #tempContComM T2
on T1.CompanyId = T2.CompanyId or T1.ChildId = T2.CompanyId
group by T1.Id
having max(cast(IsActive as int)) = 0
1 голос
/ 10 июля 2020

Возможное решение, если вы ищете только все записи дочерних строк во второй таблице, которые имеют все ложные значения Isactive

живая демонстрационная ссылка

create table tempCTE_CompMCompDir (Id  int, CompanyId int,   ChildId int)

insert into tempCTE_CompMCompDir
values
(24,  1776,  1781),
(24,  1776,  1782),
(25,  1777,  1783),
(24,  1781,  1786),
(24,  1781,  1787);


create table tempContComM(CompanyId  int,  ContactId  int, IsActive bit);

insert into tempContComM 
values
(1787  ,2903 , 1),
(1783  ,2903 , 0),
(1778  ,2903 , 0),
(1786  ,2903 , 0);

select t.* from tempCTE_CompMCompDir t join (
    select 
    id,value=max(case when ISNULL(Isactive,-1)=0 then 0 else 1 end)
    from tempCTE_CompMCompDir l 
        left join tempContComM r
            on l.companyid=r.companyid or l.childid=r.companyid
    group by id 
    ) t2 
        on t.id=t2.id and t2.value=0

Пара примечаний:

  1. Я не считал недостающие значения сопоставления ни ложными, ни истинными
  2. вы можете настроить max (case ..), чтобы изменить свои правила и критерии
...