SQL表连接改变case聚合表达式逻辑

问题描述 投票:0回答:1

使用下面的代码,当我使用 case 表达式而不将表连接在一起时,没有问题。

select t1.PNODE_ID, --t2.NODE_ID,
case
    when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_SP26,AS_SP15' then 'SP15'
    when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_SP15,AS_SP26' then 'SP15'
    when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_NP26,AS_NP15' then 'NP15'
    when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_NP15,AS_NP26' then 'NP15'
    when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_SP15,AS_NP26' then 'ZP26'
    when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_NP26,AS_SP15' then 'ZP26'
    else 'Unknown'
end as CLEANED_ZONE
from ATL_AS_REGION_MAP t1
--left join ATL_CBNODE t2 on t1.PNODE_ID = t2.NODE_ID
group by 
t1.PNODE_ID
--t2.NODE_ID

enter image description here

但是,当我尝试将表连接在一起时,只要有匹配的 NODE_ID 名称,就会调用“else”表达式。如果没有匹配的 NODE_ID 名称,则 case 表达式按预期执行。

enter image description here

我想了解为什么会发生这种情况以及如何将表与 case 表达式适当地连接在一起。

case 表达式是根据以下列输出定义的:

select t1.PNODE_ID, STRING_AGG(t1.AS_REGION_ID, ',') as AGG_STRING, t2.NODE_ID,
case
    when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_SP26,AS_SP15' then 'SP15'
    when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_SP15,AS_SP26' then 'SP15'
    when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_NP26,AS_NP15' then 'NP15'
    when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_NP15,AS_NP26' then 'NP15'
    when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_SP15,AS_NP26' then 'ZP26'
    when STRING_AGG(t1.AS_REGION_ID, ',') = 'AS_NP26,AS_SP15' then 'ZP26'
    else 'Unknown'
end as CLEANED_ZONE
from ATL_AS_REGION_MAP t1
left join ATL_CBNODE t2 on t1.PNODE_ID = t2.NODE_ID
group by 
t1.PNODE_ID,
t2.NODE_ID

enter image description here

sql sql-server join case
1个回答
0
投票

您可以在左连接之前在 CTE 中解析这些区域(与没有左连接时的操作方式相同,您发现它工作正常):

;with cte as (
    select 
        t1.PNODE_ID,
        case
            when STRING_AGG(t1.AS_REGION_ID, ',') in ('AS_SP26,AS_SP15','AS_SP15,AS_SP26') then 'SP15'
            when STRING_AGG(t1.AS_REGION_ID, ',') in ('AS_NP26,AS_NP15','AS_NP15,AS_NP26') then 'NP15'
            when STRING_AGG(t1.AS_REGION_ID, ',') in ('AS_SP15,AS_NP26','AS_NP26,AS_SP15') then 'ZP26'
            else 'Unknown'
        end as CLEANED_ZONE
    from ATL_AS_REGION_MAP t1
    group by t1.PNODE_ID
)
select 
    cte.PNODE_ID,
    atl.NODE_ID,
    cte.CLEANED_ZONE
from 
    cte
    left join ATL_CBNODE atl 
    on cte.PNODE_ID = atl.NODE_ID;
    
    
© www.soinside.com 2019 - 2024. All rights reserved.