我试图将[Product],[Activities]和[Country]三列的子字符串与两个表[sit_table]和[update_tbl]进行比较。查询应该返回实例,其中[update_tbl]中的子字符串元素在[sit_table]中不存在
[Update_tbl]
[sit_table]
期望的结果
这是我到目前为止所拥有的。但这没有给我想要的结果。
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
答案 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]