比较两个表的子字符串,仅返回差异

时间:2020-08-25 21:13:37

标签: sql sql-server

我试图将[Product],[Activities]和[Country]三列的子字符串与两个表[sit_table]和[update_tbl]进行比较。查询应该返回实例,其中[update_tbl]中的子字符串元素在[sit_table]中不存在

[Update_tbl]

enter image description here

[sit_table]

enter image description here

期望的结果

enter image description here

这是我到目前为止所拥有的。但这没有给我想要的结果。

select 
distinct

    [Product based], 
    subStringProducts.value as [Products], 
    subStringActivities.value as[activities],
    subStringCountry.value as [country)]
from 
    [update_tbl]
    cross apply string_split([update_tbl].product, ';') subStringProducts
    cross apply string_split([update_tbl].[activities], ';') as subStringActivities
    cross apply string_split([update_tbl].[country], ';') as subStringCountry
where
    subStringProducts.value not in
    (select  
        tmpSubProduct.value as [products]
    from 
        [sit_table] raSIT1
        cross apply string_split(raSIT1.[product], ';') tmpSubProduct
    where 
        [update_tbl].[product based]=  raSIT1.[Product Based]  

    ) --not in subStringProducts.value
    and
    subStringActivities.value not in 
    (select
        tmpSubActivities.value
    from 
        [sit_table] raSIT1
        cross apply string_split(raSIT1.[activities],';')tmpSubActivities
    where   
        [update_tbl].[product based]=  raSIT1.[product based] 
    ) -- not in subStringActivities.value
    and
    subStringCountry.value not in
    (select 
        tmpSubCountry.value
    from    
        [sit_table] raSIT1
        cross apply string_split(raSIT1.country, ';') tmpSubCountry
    where   
        [update_tbl].[product based]=  raSIT1.[product based] 
    )-- not in subStringCountry.value

enter image description here

2 个答案:

答案 0 :(得分:0)

这种方法将所有内容分开分割,然后在[基于产品]上使用左联接重新组合。

代码

;with
upd([Product based], Product, Activities, Country) as (
select 'Product based', 'product 1;product 2; product 3', 'activity 1;activity 2; activity 3','United States of America'),
sit([Product based], Product, Activities, Country) as (
select 'Product based', 'product 1;product 2', 'activity 2; activity 3','United States of America'),
upd_product_cte([Product based], [value]) as (
    select [Product based], [value] from upd cross apply string_split(upd.product, ';')
    except
    select [Product based], [value] from sit cross apply string_split(sit.product, ';')),
upd_activity_cte([Product based], [value]) as (
    select [Product based], [value] from upd cross apply string_split(upd.activities, ';')
    except
    select [Product based], [value] from sit cross apply string_split(sit.activities, ';')),
upd_country_cte([Product based], [value]) as (
    select [Product based], [value] from upd cross apply string_split(upd.country, ';')
    except
    select [Product based], [value] from sit cross apply string_split(sit.country, ';')),
upd_prod_agg([Product based], [value]) as (
    (select [Product based], string_agg([value],';') within group (order by value  desc) 
     from upd_product_cte
     group by [Product based])),
upd_act_agg([Product based], [value]) as (
    (select [Product based], string_agg([value],';') within group (order by value  desc) 
     from upd_activity_cte
     group by [Product based])),
upd_cntry_agg([Product based], [value]) as (
    (select [Product based], string_agg([value],';') within group (order by value  desc) 
     from upd_country_cte
     group by [Product based]))
select upa.[Product based], upa.value Product, uaa.value Activities, uca.value Country
from upd_prod_agg upa
     left join upd_act_agg uaa on upa.[Product based]=uaa.[Product based]
     left join upd_cntry_agg uca on upa.[Product based]=uca.[Product based];

结果

Product based    Product    Activities  Country
-------------    ---------  ----------  -------
Product based    product 3  activity 1  NULL

答案 1 :(得分:0)

仅对此进行测试:

select U.[Product based],
   (select string_agg(X.value,';') 
    from string_split(U.product, ';') as X
    where X.value not in (select Y.value from string_split(S.product, ';') as Y)as product,
   (select string_agg(X.value,';') 
    from string_split(U.activities, ';') as X
    where X.value not in (select Y.value from string_split(S.activities, ';') as Y) as activities,
   (select string_agg(X.value,';') 
    from string_split(U.country, ';') as X
    where X.value not in (select Y.value from string_split(S.country, ';') as Y)as country
from Update_tbl as U
left join sit_table as S on S.[Product based]=U.[Product based]
相关问题