我有一个包含联系人列表的数据库表,其中一些联系人可能有多个记录,例如
CustomerID, CustomerName, Vehicle
1, Dan, Mazda
1, Dan, Suzuki
2, John, Ford
3, Dasha, Volvo
3, Dasha, Ford
我可以编写一个选择查询来返回不同的 customerID 和 CustomerName,以及 1 条记录中的车辆列表吗?即
1, Dan, Mazda+Suzuki
2, John, Ford
3, Dasha, Volvo+Ford
谢谢
最佳答案
有一些nice answers to this problem on another question 。
根据the linked article ,由于使用了 XML 函数,这仅适用于 SQL Server 2005 及以上版本。摘自文章-
SELECT table_name,
LEFT(column_names,LEN(column_names) - 1) AS column_names
FROM (SELECT table_name,
(SELECT column_name + ',' AS [text()]
FROM information_schema.columns AS internal
WHERE internal.table_name = table_names.table_name
FOR xml PATH ('')
) AS column_names
FROM (SELECT table_name
FROM information_schema.columns
GROUP BY table_name) AS table_names) AS pre_trimmed;
Second version (admittedly inspired by this post, which I stumbled on after writing the first version):
SELECT table_name,
LEFT(column_names,LEN(column_names) - 1) AS column_names
FROM information_schema.columns AS extern
CROSS APPLY (SELECT column_name + ','
FROM information_schema.columns AS intern
WHERE extern.table_name = intern.table_name
FOR XML PATH('')
) pre_trimmed (column_names)
GROUP BY table_name,column_names;
The second CROSS APPLY version is supposedly slower according to the execution plan, but I didn’t conduct any benchmarks at all.
关于sql - 将重复记录合并到 1 个字段中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/527533/