データは一度正規化されると問題になりません。これは任意の数のfunctions or tricksによって行うことができます。 XMLトリックを通じ
With Src As (
Select * From (Values
(1, '10,11,12,13', 4),
(2, '10,13,15,4' , 5)
) V (Id, MentionedUserId, CreatorUserId)
), Normalised As (
Select CreatorUserId, CAST(display_term AS int) As MentionedUserId
From Src
Cross Apply (
Select display_term
From sys.dm_fts_parser('"' + MentionedUserId + '"', 1033, 0, 0)
Where display_term NOT Like 'nn%'
) Split
), UserList As (
Select CreatorUserId As UserId From Normalised Union
Select MentionedUserId From Normalised
)
Select UserId,
(Select Count(*) From Normalised Where MentionedUserId = UserId) As MentionedUserCount,
(Select Count(*) From Src Where CreatorUserId = UserId) As CreatorUserCount
From UserList;
:
With Src As (
Select * From (Values
(1, '10,11,12,13', 4),
(2, '10,13,15,4' , 5)
) V (Id, MentionedUserId, CreatorUserId)
), Normalised As (
Select CreatorUserId, y.i.value('(./text())[1]', 'int') As MentionedUserId
From Src
Cross Apply (Select CONVERT(XML, '<i>' + REPLACE(MentionedUserId, ',', '</i><i>') + '</i>').query('.') As x) As a
Cross Apply x.nodes('i') As y(i)
), UserList As (
Select CreatorUserId As UserId From Normalised Union
Select MentionedUserId From Normalised
)
Select UserId,
(Select Count(*) From Normalised Where MentionedUserId = UserId) As MentionedUserCount,
(Select Count(*) From Src Where CreatorUserId = UserId) As CreatorUserCount
From UserList;
**ヒント:使用可能なマイクロソフトフルテキスト検索では
** 1列に**しない**ストア、複数の値を行う - この**ひどく悪いデザイン**であり、データベース設計の最初の通常の形式にも違反しています。適切なリレーショナル構造を使用し、カラムあたり1つの*値を格納します。 –
なぜ 'MiredUserCount'の' UserId'12が '0'ですか? –
申し訳ありませんが、それは1でなければなりません。ありがとう –