【SQLSERVER】处理一对多标签的语法糖

数据库表设计的时候,经常会出现一对多的情况,比如标签、明细之类的。

有时,需要在一个查询中,将每个主体的所有标签在一个字段中展示出来,这个时候就可以用 FOR XML PATH 这个语法轻易的实现。

示例代码:

-- 人物 
CREATE TABLE man(
id INT NOT NULL DEFAULT 0,
name NVARCHAR(50) NOT NULL DEFAULT ''
)
INSERT INTO man(id,name)
VALUES(1,'肥仔'),(2,'阿呆'),(3,'小新')

--人物-标签
CREATE TABLE man_ontag(
id INT NOT NULL DEFAULT 0,
tag NVARCHAR(50) NOT NULL DEFAULT ''
)
INSERT INTO man_ontag(id,tag)
VALUES(1,'帅气'),(1,'搞笑'),(1,'幽默'),(2,'帅气'),(2,'搞笑'),(3,'帅气')


SELECT * FROM man
SELECT * FROM man_ontag

SELECT a.id,
       a.name,
       STUFF((SELECT ''+ tg.tag FROM dbo.man_ontag tg WHERE a.id= tg.id FOR XML PATH('')),1,1,'') AS tags,
       STUFF((SELECT ' | '+ tg.tag FROM dbo.man_ontag tg WHERE a.id= tg.id FOR XML PATH('')),1,3,'') AS tags2  
FROM man a

DROP TABLE man
DROP TABLE man_ontag

效果:

posted @ 2018-07-24 16:26  TurboWay  阅读(442)  评论(0编辑  收藏  举报