5

次のテーブルがあるとします。

id|myId|Name
-------------
1 | 3  |Bob 
2 | 3  |Chet
3 | 3  |Dave
4 | 4  |Jim
5 | 4  |Jose
-------------

再帰 CTE を使用して次の出力を生成することは可能ですか?

3 | Bob, Chet, Date
4 | Jim, Jose

私はそれを少しいじりましたが、それを機能させることができませんでした。別のテクニックを使った方が良いでしょうか?

4

3 に答える 3

7

これはお勧めしませんが、なんとか解決しました。

テーブル:

CREATE TABLE [dbo].[names](
    [id] [int] NULL,
    [myId] [int] NULL,
    [name] [char](25) NULL
) ON [PRIMARY]

データ:

INSERT INTO names values (1,3,'Bob')
INSERT INTO names values 2,3,'Chet')
INSERT INTO names values 3,3,'Dave')
INSERT INTO names values 4,4,'Jim')
INSERT INTO names values 5,4,'Jose')
INSERT INTO names values 6,5,'Nick')

クエリ:

WITH CTE (id, myId, Name, NameCount)
     AS (SELECT id,
                myId,
                Cast(Name AS VARCHAR(225)) Name,
                1                          NameCount
         FROM   (SELECT Row_number() OVER (PARTITION BY myId ORDER BY myId) AS id,
                        myId,
                        Name
                 FROM   names) e
         WHERE  id = 1
         UNION ALL
         SELECT e1.id,
                e1.myId,
                Cast(Rtrim(CTE.Name) + ',' + e1.Name AS VARCHAR(225)) AS Name,
                CTE.NameCount + 1                                     NameCount
         FROM   CTE
                INNER JOIN (SELECT Row_number() OVER (PARTITION BY myId ORDER BY myId) AS id,
                                   myId,
                                   Name
                            FROM   names) e1
                  ON e1.id = CTE.id + 1
                     AND e1.myId = CTE.myId)
SELECT myID,
       Name
FROM   (SELECT myID,
               Name,
               (Row_number() OVER (PARTITION BY myId ORDER BY namecount DESC)) AS id
        FROM   CTE) AS p
WHERE  id = 1 

要求に応じて、XML メソッドを次に示します。

SELECT myId,
       STUFF((SELECT ',' + rtrim(convert(char(50),Name))
        FROM   namestable b
        WHERE  a.myId = b.myId
        FOR XML PATH('')),1,1,'') Names
FROM   namestable a
GROUP BY myId
于 2010-06-30T16:46:53.430 に答える
2

CTEは、いくつかの追加機能(再帰など)を備えた単なる栄光の派生テーブルです。問題は、これを行うために再帰を使用できるかどうかです。おそらく、しかしそれは釘を打ち込むためにドライバーを使用しています。XMLパス(最初の回答に見られる)を実行することの良いところは、MyId列のグループ化と文字列の連結を組み合わせることです。

CTEを使用して文字列のリストをどのように連結しますか?それが目的ではないと思います。

于 2010-06-30T17:33:12.103 に答える