一、創建表
1.Person人員表
CREATE TABLE [dbo].[Person](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nchar](10) NULL,
[InClub] [nvarchar](255) NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
2.PersonClub 社團表
CREATE TABLE [dbo].[PersonClub](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ClubName] [nvarchar](50) NULL,
CONSTRAINT [PK_PersonClub] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
注意:InClub字段是表示該人加入了哪些社團 用 ','隔開。(我個人不建議這樣設計表,但是有時候確實有這種情況)
二、加入點數據 並查詢出來
1 張三 1,3,5
2 李四 2,3,4
3 王無 3,2
1 編程協會
2 羽毛球協會
3 武術協會
4 旋律社
5 動漫社
6 攝影社
三、查詢所有人以及所有人加入的社團情況
SELECT *
FROM Person D
CROSS APPLY (
SELECT STUFF((
SELECT ',' + C.ClubName
FROM Person A
CROSS APPLY f_split(A.InClub, ',') B
LEFT JOIN PersonClub c ON c.ID = B.a
WHERE A.ID = D.ID
FOR XML path('')
), 1, 1, '') AS ClubName
) E
結果
1 張三 1,3,5 編程協會,武術協會,動漫社
2 李四 2,3,4 羽毛球協會,武術協會,旋律社
3 王無 3,2 武術協會,羽毛球協會
備註: f_split 表值函數是在網上找的,用於分割字符串爲臨時表,這裏不做討論。