📅  最后修改于: 2023-12-03 15:38:26.712000             🧑  作者: Mango
在 MySQL 中,我们可以使用 GROUP_CONCAT 函数来将每个分组的多个行合并为一个单独的字符串。但是,在 SQL Server 中并没有类似的函数。不过,我们可以通过一些技巧来模拟实现 GROUP_CONCAT 的功能。
STUFF 和 FOR XML PATH 方法是一种常用的模拟 GROUP_CONCAT 的方法。下面是一个使用 STUFF 和 FOR XML PATH 方法的示例:
SELECT
column1,
STUFF((SELECT ',' + column2
FROM your_table
WHERE your_table.column1 = t.column1
FOR XML PATH ('')),1,1,'') AS concatenated_values
FROM your_table t
GROUP BY column1;
在上面的示例中,我们先使用了一个子查询来选择需要合并的列,然后使用 FOR XML PATH ('') 来将多行内容合并为一行,最后使用 STUFF 函数来去除第一个逗号。
还有一种模拟 GROUP_CONCAT 的方法是使用递归查询方法。这种方法比较麻烦,但是在某些情况下,它可能会比使用 STUFF 和 FOR XML PATH 更有效。
下面是一个使用递归查询方法模拟 GROUP_CONCAT 的示例:
WITH RECURSIVE cte (column1, concatenated_values) AS (
SELECT
column1,
CAST(column2 AS VARCHAR(8000)) AS concatenated_values
FROM your_table
WHERE parent_id IS NULL -- This condition depends on your data structure
UNION ALL
SELECT
s.column1,
CAST(c.concatenated_values + ',' + s.column2 AS VARCHAR(8000)) -- here 8000 is used as length
FROM your_table s
JOIN cte c ON c.column1 = s.parent_id -- This condition depends on your data structure
)
SELECT column1, concatenated_values
FROM cte
GROUP BY column1;
在上面的示例中,我们使用了一个递归公共表表达式(CTE)来递归地将多个行合并为一个单独的字符串。该 CTE 由两部分组成:基本查询和递归查询。基本查询选择根节点(parent_id 为 NULL)的记录,并将其转换为字符串。递归查询通过将当前行连接到父记录的字符串来递归地合并行。
以上两种方法返回的结果形式相同,都是在原始表的每个分组中将多个行合并为一个单独的字符串。可以在 SELECT 语句中将它们与其他列一起选择。
| column1 | concatenated_values |
|---------|---------------------|
| A | a,b,c |
| B | d,e,f |
这是一个 Markdown 格式的输出示例。