通过唯一标识符组合查询结果的行?
Posted
技术标签:
【中文标题】通过唯一标识符组合查询结果的行?【英文标题】:Combining rows of queried results by unique identifier? 【发布时间】:2012-03-17 09:30:36 【问题描述】:我有一个查询,它搜索多个表,并为其中一个查询表的一个特定列中的每个值返回一行。该表为一个唯一标识符返回多行。我想要做的是组合那些具有相同唯一标识符的行,并组合用逗号分隔的列值中的 2 个,并将这些值作为唯一列返回。
例子:
Museum MuseumID Country City Paintings Sculptures
Louvre 345 France Paris Mona Lisa NULL
Louvre 345 France Paris NULL Venus De Milo
Louvre 345 France Paris Ship of Fools NULL
相反,我想让查询这样做:
Museum MuseumID Country City Art
Louvre 345 France Paris Mona Lisa, Venus De Milo, Ship of Fools
我需要将此查询转换为可在 C# 程序中使用的存储过程。起初,我只是按原样获取数据,并使用 C# 使用数组和一些逻辑组合行,但我必须将其设为存储过程,而不是让数据进入已经排序和组合的 C# 程序。我不想我必须。我需要帮助。
有人可以帮忙吗?
【问题讨论】:
Concatenate grouped rows 的可能重复项 【参考方案1】:鉴于此示例数据:
CREATE TABLE #a
(
Museum varchar(32),
MuseumID int,
Country varchar(32),
City varchar(32),
Paintings varchar(32),
Sculptures varchar(32)
);
INSERT #a VALUES
('Louvre',345,'France','Paris', 'Mona Lisa', NULL),
('Louvre',345,'France','Paris', NULL, 'Venus De Milo'),
('Louvre',345,'France','Paris', 'Ship of Fools', NULL);
在旧版本的 SQL Server 中,我们必须使用派生表执行分组字符串聚合,该派生表使用 FOR XML PATH
将字符串组合在一起:
SELECT Museum, MuseumID, Country, City,
Art = STUFF((SELECT ', ' + COALESCE(Paintings, Sculptures, '')
FROM #a AS a2
WHERE a2.museum = a.museum AND a2.MuseumID = a.MuseumID
AND a2.Country = a.Country AND a2.City = a.City
FOR XML PATH(''),
TYPE).value(N'./text()[1]', N'varchar(max)'), 1,2,'')
FROM #a AS a
GROUP BY Museum, MuseumID, Country, City;
在 SQL Server 2017+ 中,我们可以使用STRING_AGG()
进行更简单、更高效的查询:
SELECT Museum, MuseumID, Country, City,
Art = STRING_AGG(COALESCE(Paintings, Sculptures, ''), ', ')
FROM #a
GROUP BY Museum, MuseumID, Country, City;
两种情况的结果:
Museum | MuseumID | Country | City | Art |
---|---|---|---|---|
Louvre | 345 | France | Paris | Mona Lisa, Venus De Milo, Ship of Fools |
(请注意,如果一幅画或雕塑的名称中带有逗号,这可能并不罕见,您将无法分辨。所以有时最好选择一个出现概率非常低的分隔符在数据中,如管道 ('|'
) 或使用 nvarchar
作为基本类型和一些 Unicode 字符,如双管道 (N'‖'
)。)
【讨论】:
【参考方案2】:根据this,您应该使用COALESCE
。
我会首先将“绘画”和“雕塑”列合并为一个名为 OneArt 的列(在您的第一个查询中),然后对其使用 COALESCE 和 GROUP BY MuseumID。
【讨论】:
以上是关于通过唯一标识符组合查询结果的行?的主要内容,如果未能解决你的问题,请参考以下文章