再某种特定情况下,我们需要用到表合并的处理,例如将多行数据根据某个字段转换为1行。 这个时候就需要用到stuff这个函数了。
原表样
合并处理后表样
原表样代码:
IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[用户角色表]') AND type IN ('U')) DROP TABLE [dbo].[用户角色表] GO CREATE TABLE [dbo].[用户角色表] ( [id] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL, [user] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL, [role] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL ) GO ALTER TABLE [dbo].[用户角色表] SET (LOCK_ESCALATION = TABLE) GO -- ---------------------------- -- Records of 用户角色表 -- ---------------------------- INSERT INTO [dbo].[用户角色表] ([id], [user], [role]) VALUES (N'1', N'lin', N'A') GO INSERT INTO [dbo].[用户角色表] ([id], [user], [role]) VALUES (N'2', N'lin', N'B') GO INSERT INTO [dbo].[用户角色表] ([id], [user], [role]) VALUES (N'3', N'lin', N'C') GO
合并处理代码:
SELECT [USER] , stuff(( SELECT ',' + role FROM 用户角色表 WHERE [USER] = a.[USER] FOR XML path('') ), 1, 1, '') role FROM 用户角色表 a GROUP BY [USER]