カーソルなしもwhileも、このサイトの以前の質問の組み合わせです
- 列を分割する
- ジョイン・ザ・ロウズ・バック
答えはstring Split function
CREATE FUNCTION [dbo].[StringSplit]
(
@delimited nvarchar(max),
@delimiter nvarchar(100)
) RETURNS @t TABLE
(
-- Id column can be commented out, not required for sql splitting string
id int identity(1,1), -- I use this column for numbering splitted parts
val nvarchar(max)
)
AS
BEGIN
declare @xml xml
set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r></root>'
insert into @t(val)
select
r.value('.','varchar(max)') as item
from @xml.nodes('//root/r') as records(r)
RETURN
END
クエリは次のようになります。
declare @Article table
(
ArticleCategories varchar(100)
)
insert into @Article values
('3193;2867;3193;'),
('2871;2923;2923;'),
('3278;3337;3337;'),
('2878;2876;2878;'),
('3720;3680;3680;')
;WITH DistinctArticles AS (
SELECT DISTINCT ArticleCategories, Val
FROM @article
CROSS APPLY dbo.[StringSplit](ArticleCategories, ';')
WHERE Val <> ''
),
Concatenated AS (
SELECT
ArticleCategories,
STUFF((
SELECT '; ' + CAST([Val] AS VARCHAR(MAX))
FROM DistinctArticles
WHERE (ArticleCategories = Results.ArticleCategories)
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)'),1,2,'') + ';' AS DistinctArticleCategories
FROM DistinctArticles Results
GROUP BY ArticleCategories
)
UPDATE @Article
SET ArticleCategories = Concatenated.DistinctArticleCategories
FROM @Article a
INNER JOIN Concatenated ON a.ArticleCategories = Concatenated.ArticleCategories