Първо, най-доброто решение е да не съхранявате данни в разделен със запетая списък във вашата база данни. Трябва да помислите за коригиране на структурата на таблицата.
Ако не можете да промените структурата на таблицата, тогава ще трябва да разделите данните в списъка на редове, за да присвоите правилното име. След като данните се разделят, можете да ги свържете обратно в списъка.
Има много различни разделяне
функция, която можете да намерите онлайн, но ето версия, която обикновено използвам:
СЪЗДАВАНЕ НА ФУНКЦИЯ [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 прекъсване край връщане край;
За да получа вашия резултат, бих започнал с прилагане на split
функция и номер_ред()
тъй като не виждам уникален ключ, свързан с всеки ред. Ако имате уникален ключ на всеки ред, тогава няма да имате нужда от row_number()
:
;с cte as( изберете rn, име, идентификатор от ( изберете row_number() над (подредете по (изберете 1)) rn, име на база данни от таблица2 ) t2 кръстосано приложи dbo.split(t2.databasename, ' ,') i таблица за вътрешно свързване1 t1 на i.items =t1.id) изберете *от cte
Тази заявка разделя вашия списък, разделен със запетая, на следното:
<предварителен код>| RN | ИМЕ | Идентификатор |-------------------| 1 | MSSQL | 1 || 1 | Oracle | 3 || 2 | MySQl | 2 || 3 | MSSQL | 1 || 3 | MySQl | 2 |
След като имате данните в няколко реда с правилното name
, тогава можете да използвате STUFF()
и ЗА XML ПЪТ
за да го свържете в списъка. Пълната ви заявка би била подобна на тази:
;с cte as( изберете rn, име, идентификатор от ( изберете row_number() над (подредете по (изберете 1)) rn, име на база данни от таблица2 ) t2 кръстосано приложи dbo.split(t2.databasename, ' ,') i вътрешна таблица за свързване1 t1 на i.items =t1.id) изберете STUFF( (SELECT ', ' + c2.name ОТ cte c2 където c1.rn =c2.rn подредете по c2.id ЗА XML ПЪТ (' ')) , 1, 1, '') Име на база данни от cte c1group от c1.rnorder by c1.rn;
Вижте SQL Fiddle с демонстрация.
Резултатът от пълната заявка е:
<предварителен код>| ИМЕ НА БАЗА ДАННИ |-----------------| MSSQL, Oracle || MySQl || MSSQL, MySQl |