sql >> データベース >  >> RDS >> Sqlserver

IDでグループ化されたコンマ区切りリストを選択し直します

    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番目のパラメーター 返されるデータ型を指定します。



    1. Android:InsertHelperが非推奨の場合の一括挿入

    2. MariaDBの日付から短い月の名前を取得する2つの方法

    3. PostgreSQLで秒単位のタイムスタンプ間の違いを見つける

    4. mysqlでjoinを使用する場合は、右側のテーブルから最新のレコードを選択してください