2

背景: **私は **MS2005 を実行しています。次のようなデータを含む MASTER テーブル (ID、MDESC) と DETAIL テーブル (MID、DID、DDESC) があります。

1 MASTER_1
2 MASTER_2
1 L1 DETAIL_M1_L1
1 L2 DETAIL_M1_L2
1 L3 DETAIL_M1_L3
2 L1 DETAIL_M2_L1
2 L2 DETAIL_M2_L2

テーブルを結合すると

SELECT M.*, D.DID FROM MASTER M INNER JOIN DETAIL D on M.ID = D.MID

次のようなリストを取得します。

1 MASTER_1 L1
1 MASTER_1 L2
1 MASTER_1 L3
2 MASTER_2 L1
2 MASTER_2 L2

質問: MS SQL の select ステートメントを使用して、詳細レコードを次のようにカンマ区切りのリストに取得する方法はありますか?

1 MASTER_1 "L1, L2, L3"
2 MASTER_2 "L1, L2"
4

5 に答える 5

3

関数が必要です:-

 CREATE FUNCTION [dbo].[FN_DETAIL_LIST]
 (
     @masterid int
 )
 RETURNS varchar(8000)
 AS 
 BEGIN
     DECLARE @dids varchar(8000)

     SELECT @dids = COALESCE(@dids + ', ', '') + DID
     FROM DETAIL
     WHERE MID = @masterid
     RETURN @dids
 END

使用法:-

SELECT MASTERID, [dbo].[FN_DETAIL_LIST](MASTERID) [DIDS]
FROM MASTER
于 2009-02-13T20:23:17.860 に答える
2

ビルカーウィンからのリンクのコンセプトのおかげで、それを機能させるのはクロスアプライです

SELECT ID, DES, LEFT(DIDS, LEN(DIDS)-1) AS DIDS
 FROM MASTER M1 INNER JOIN DETAIL D on M1.ID = D.MID 
  CROSS APPLY (
    SELECT DID + ', '
    FROM MASTER M2 INNER JOIN DETAIL D on M2.ID = D.MID 
    WHERE M1.ID = M2.ID
    FOR XML PATH('')
   ) pre_trimmed (DIDS)
GROUP BY ID, DES, DIDS

結果:

ID  DES        DIDS
--- ---------- ---------------
1   MASTER_1   L1, L2, L3
2   MASTER_2   L1, L2
于 2009-02-13T20:36:49.123 に答える
1

合体はあなたの友達です。

declare @CSL vachar(max)

set @CSL = NULL
select @CSL = coalesce(@CSL + ', ', '') + cast(DID as varchar(8))
from MASTER M INNER JOIN DETAIL D on M.ID = D.MID

select @CSL

これは、一般化されたクエリではうまく機能しません (つまり、単一のマスター レコードではうまく機能します)。

これを関数にドロップできます...しかし、それでは必要な/必要なパフォーマンスが得られない場合があります。

于 2009-02-13T20:08:40.547 に答える
1

これが MySQL のGROUP_CONCAT()集計関数の目的です。残念ながら、この機能をサポートしていない他の RDBMS ブランドでこの機能を複製するのは簡単ではありません。

Microsoft SQL Server 2005 で group_concat MySQL 関数をシミュレートするを参照してください。

于 2009-02-13T20:13:01.393 に答える
0

最近のバージョンの SQL Server でこれを正しく機能させるには、次の関数が必要だと思います。

http://sqljunkies.com/WebLog/amachanic/archive/2004/11/10/5065.aspx?Pending=true

于 2009-02-13T20:16:16.690 に答える