通过唯一标识符组合查询结果的行?

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
示例db<>fiddle

(请注意,如果一幅画或雕塑的名称中带有逗号,这可能并不罕见,您将无法分辨。所以有时最好选择一个出现概率非常低的分隔符在数据中,如管道 ('|') 或使用 nvarchar 作为基本类型和一些 Unicode 字符,如双管道 (N'‖')。)

【讨论】:

【参考方案2】:

根据this,您应该使用COALESCE

我会首先将“绘画”和“雕塑”列合并为一个名为 OneArt 的列(在您的第一个查询中),然后对其使用 COALESCE 和 GROUP BY MuseumID。

【讨论】:

以上是关于通过唯一标识符组合查询结果的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何更新没有任何数据的行以唯一标识该行?

XCUIElement 唯一标识符

根据每个唯一标识符的条件更新值

Jquery .ajax():唯一的 AJAX 查询标识符?

获取移动设备唯一标识

两列上的 BigQuery 重复数据删除作为唯一键