Вы не должны хранить несколько значений в одном столбце, поэтому я бы посоветовал вам исправить вашу модель данных.
Тем не менее, вы можете делать то, что вы хотите, разбирая строки и реагрегируя :
select a.*, b.*
from a outer apply
(select string_agg(b.Webcode_Fullname, ',') as Webcode_Fullname,
string_agg(b.Webcode_Fullname, ',') as Colors
from string_split(a.recipe_web_codes, ' ') s join
b
on s.value = b.Recipe_Web_Code
) b;
Очень важно: string_split()
не гарантирует порядок значений. Если упорядочение результирующих строк важно, вы можете справиться с этим - при условии, что у вас нет дубликатов - используя logi c, например:
select a.*, b.*
from a outer apply
(select string_agg(b.Webcode_Fullname, ',') within group (order by charindex(b.Recipe_Web_Codeas, a.recipe_web_codes)) as Webcode_Fullname,
string_agg(b.Webcode_Fullname, ',') within group (order by charindex(b.Recipe_Web_Codeas, a.recipe_web_codes)) as Colors
from string_split(a.recipe_web_codes, ' ') s join
b
on s.value = b.Recipe_Web_Code
) b;
Позвольте мне еще раз подчеркнуть, что вы должны поставить свои попытайтесь исправить свою модель данных, имея отдельную таблицу для веб-кодов рецептов, по одной строке на код.
РЕДАКТИРОВАТЬ:
Одним из решений для более старых версий является рекурсивный CTE:
with bs as (
select b.*, row_number() over (order by id) as seqnum
from b
),
cte as (
select a.id, convert(varchar(max), Recipe_Web_Codes) as fullnames, convert(varchar(max), Recipe_Web_Codes) as colors, 1 as ind
from a
union all
select cte.id,
replace(cte.fullnames, bs.Recipe_Web_Code, bs.Webcode_Fullname),
replace(cte.colors, bs.Recipe_Web_Code, bs.color),
1 + cte.ind
from cte join
bs
on cte.ind = bs.seqnum and ind < 10
)
select cte.id, cte.fullnames, cte.colors
from (select cte.*, max(ind) over (partition by id) as max_ind
from cte
) cte
where ind = max_ind ;
Здесь - это дБ <> скрипка.