none
複数レコード値を1フィールドに抽出するクエリ RRS feed

  • 質問

  • SQLの書き方について、何か案を頂きたいです。

    DBはSQL Server2012です。

    基本的な話になるかもしれませんが、下記のようなテーブル関係に対して

    tableA------   ※IDはユニークキー

    ID   |   price

    1    |   100

    2    |   200

     

    table B------    ※IDはユニークキーではない。

    ID  | attribute

    1    |    a

    1    |    b

    1    |    c

    2    |    b

    クエリ文で(tableAとBのIDを連結させて)、下記のような結果を取得する方法はありますでしょうか?

    ID   |   price  | attribute

    1    |   100     | a,b,c

    2    |   200     | b


    よろしくお願いします。


    • 編集済み rakman 2015年4月3日 10:48
    2015年4月3日 10:47

回答

  • こんにちは。

    OracleではListAggというやつで出来るんですが、
    SQLServerの場合は以下のようにXMLから置換かける方法があるみたいです。

    SELECT
    	A.Id,
    	A.price,
    	REPLACE((
    		SELECT
    			B.attribute As [data()]
    		FROM
    			TblB As B
    		WHERE
    			B.id = A.Id
    		FOR XML PATH('')), ' ', ',') As attribute
    FROM
    	TblA As A


    • 回答としてマーク rakman 2015年4月7日 1:09
    2015年4月3日 11:38
    モデレータ
  • もしくはstuffを使っても以下のように書けますね。

    SELECT
    	A.Id,
    	A.price,
    	stuff((
    		SELECT
    			',' + B.attribute
    		FROM
    			tableb As B
    		WHERE
    			B.id = A.Id
    		FOR XML PATH('')), 1, 1, '') As attribute
    FROM
    	tablea As A


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク rakman 2015年4月7日 1:09
    2015年4月6日 2:09

すべての返信

  • こんにちは。

    OracleではListAggというやつで出来るんですが、
    SQLServerの場合は以下のようにXMLから置換かける方法があるみたいです。

    SELECT
    	A.Id,
    	A.price,
    	REPLACE((
    		SELECT
    			B.attribute As [data()]
    		FROM
    			TblB As B
    		WHERE
    			B.id = A.Id
    		FOR XML PATH('')), ' ', ',') As attribute
    FROM
    	TblA As A


    • 回答としてマーク rakman 2015年4月7日 1:09
    2015年4月3日 11:38
    モデレータ
  • もしくはstuffを使っても以下のように書けますね。

    SELECT
    	A.Id,
    	A.price,
    	stuff((
    		SELECT
    			',' + B.attribute
    		FROM
    			tableb As B
    		WHERE
    			B.id = A.Id
    		FOR XML PATH('')), 1, 1, '') As attribute
    FROM
    	tablea As A


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク rakman 2015年4月7日 1:09
    2015年4月6日 2:09
  • Tak1waさん、trapemiyaさん

    回答ありがとうございます。

    初めて見る記述ばかりですが、勉強になりました。

    こういった抽出方法になると、Oracleとの差が出てくるのですね。(内容はおよそ同じようですが。)

    2015年4月7日 1:09