sql server—sql查询逻辑,用于获取所有可能层次结构的isactive false ID

k4ymrczo  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(358)

最终结果不应包括ID24,因为此id具有与公司层次结构的活动Map: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有分层的数据公司和子公司。
表2显示了叶级公司的isactive true或false。
输出:
从表1中获取所有ID
如果表1中的公司id或子id通过层次结构Map到表2的公司id,并且此Map的isactive在所有情况下都为false。
样本数据的输出应为:

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)

bhmjp9jg

bhmjp9jg1#

如果您只在第二个表中查找具有所有false 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

注意事项:
我将缺少的Map值视为既不是false也不是true
你可以调整max(case..)来改变你的规则和标准

xj3cbfub

xj3cbfub2#

此查询将companyid或childid与isactive=1的原始值匹配的所有#tempcteŠcompmcompdir.id丢弃到第二个表中;这就是我对你想要达到的目标的理解

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

相关问题