select ET1.EntryID,
(
select ', '+T.Name
from Tags as T
inner join EntryTag as ET2
on T.TagID = ET2.TagID
where ET1.EntryID = ET2.EntryID
for xml path(''), type
).value('substring(text()[1], 3)', 'varchar(max)') as TagsCommaDelimited
from EntryTag as ET1
group by ET1.EntryID
クエリの分析
メインクエリはgroup by
を実行します したがって、EntryID
ごとに1行しか取得できません。 。
列TagsCommaDelimited
相関サブクエリで作成されます。
SQLServerの場合for xml path
クエリ結果のXML表現を作成するために使用されます。列エイリアスとpath
のパラメータを使用して、XMLの作成方法を適切に制御できます。 およびroot
。
連結された値', '+T.Name
相互に関連するサブクエリには、列名とfor xml path('')
への空のパラメータがありません。 タグなしでxmlを作成します。返されるテキスト値は1つだけです。
type
を追加する場合
for xml
データ型をクエリすると、XML
になります 。
XMLから値を取得するには、 value()
方法。文字列にキャストすることもできますが、そうすると、たとえば&
が表示されます。 &
を使用した文字列内 。
value()
の最初のパラメーター 関数は、必要な値を取得するために使用されるxQuery式です。 text()
を使用する 現在の要素の値のみが必要であることを指定します。 [1]
SQL Serverに、最初のテキストノードを検出するように指示しています(ここには1つしかありません)が、それでも必要です。
for xml
によって作成された文字列 クエリには、文字列の先頭に余分なコンマとスペースがあり、これを削除する必要があります。ここでは、XQuery関数 substring
を使用しています。
最初の2文字以外のすべてを取得します。
value()
の2番目のパラメーター 返されるデータ型を指定します。