我有一个包含联系人列表的数据库表,其中一些联系人可能有多个记录,例如
CustomerID, CustomerName, Vehicle
1, Dan, Mazda
1, Dan, Suzuki
2, John, Ford
3, Dasha, Volvo
3, Dasha, Ford
我可以编写一个select查询来返回不同的customerID和CustomerName,以及1条记录中的车辆列表吗?即。
1, Dan, Mazda+Suzuki
2, John, Ford
3, Dasha, Volvo+Ford
由于
答案 0 :(得分:3)
有一些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;
第二版(诚然受到启发 this post,我偶然发现了 写第一个版本):
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;
第二个CROSS APPLY版本是 据说比较慢 执行计划,但我没有进行 任何基准都可以。
答案 1 :(得分:1)
我不确定是否可以通过单个sql完成。但是,上次我在sybase的tsql中尝试这个时,我使用了临时表和游标。所以它至少可以使用那条路线完成。
答案 2 :(得分:0)
我很确定你不能通过单个SQL查询来完成它。
如果这是常规要求,则应为每个客户ID调用一个函数。
SELECT abc.CustomerID,
dbo.udf_getCSVCustomerVehicles(abc.customerID)
FROM (SELECT DISTINCT CustomerID
FROM TABLE) abc
ORDER BY abc.CustomerID
然后创建一个标量函数,将值合并为一个变量并返回结果。