Вие ще искате да използвате някакъв вид функция за разделяне с таблица, подобна на тази:
create FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1)) връща @temptable TABLE (items varchar(MAX)) като начало декларира @idx int declare @slice. varchar(8000) изберете @idx =1, ако len(@String)<1 или @String е нула, връщане, докато @idx!=0 начало set @idx =charindex(@Delimiter,@String) ако @idx!=0 set @ slice =left(@String,@idx - 1) else set @slice =@String if(len(@slice)>0) вмъкнете в @temptable(Items) стойности(@slice) set @String =right(@String, len(@String) - @idx) ако len(@String) =0 прекъсване край връщане край;
След това можете да използвате външно прилагане
за да се присъедините към вашата маса:
изберете t1.reference, t1.name, t1.subjecttitle, i.items субекти от вашата таблица t1outer apply dbo.split(t1.subjects, ',') i
Дава резултат като този:
<предварителен код>| СПРАВКА | ИМЕ | SUBJECTSTITLE | ТЕМИ |------------------------------------------------ ------------------------| LL9X81MT | Изработка и декориране на грънчарски съдове | (нула) | F06 || LL9X81MT | Изработка и декориране на грънчарски съдове | (нула) | F27 || LL9X81MT | Изработка и декориране на грънчарски съдове | (нула) | F38 |Вижте SQL скрипка с демонстрация
Ако искате да направите това без функция за разделяне, тогава можете да използвате CTE:
;с cte (препратка, име, заглавие, субект, субекти) като (изберете препратка, име, заглавие на тема, cast(left(subjects, charindex(',',subjects+',')-1) като varchar(50)) subjectitem, stuff(subjects, 1, charindex(',',subjects+','), '') субекти от вашия обединение на таблицата всички изберете препратка, име, заглавие на тема, cast(left(subjects, charindex(', ',subjects+',')-1) като varchar(50)) , stuff(subjects, 1, charindex(',',subjects+','), '') теми от cte, където субекти> '') изберете препратка, име, тема, заглавие, предмет от cte
Вижте SQL Fiddle с демонстрация