我有像
这样的表格-- REGIONS
-- ==========================
-- id | name
-- ==========================
-- 1 | 'Western Europe'
-- 2 | 'United States'
-- 3 | 'United Kingdom'
-- 4 | 'Middle East and Africa'
-- 5 | 'Latin America'
-- 6 | 'Japan'
-- 7 | 'India'
-- 8 | 'Germany'
-- 9 | 'Greater China'
-- 10 | 'France'
-- 11 | 'Central and Eastern Europe'
-- 12 | 'Canada'
-- 13 | 'Asia Pacific'
和
-- Partners
-- ==============================================================================================================
-- id | first_name | last_name | org_name | email | region_id
-- ==============================================================================================================
-- 1 | 'Dick' | 'Cheney' | 'Haliburton' | 'DCheney@Haliburton.org' | 2
-- 2 | 'Warren' | 'Buffet' | 'Berkshire Hathaway' | 'WarrenBridgemaster@bershire.org' | 2
以及让合作伙伴成为其关联地区名称的程序,例如
CREATE PROCEDURE GetPartnersWithRegion
AS
SELECT Partners.id,
Partners.first_name,
Partners.last_name,
Partners.org_name,
Partners.email,
Regions.name
FROM Partners INNER JOIN Regions
ON Partners.region_id=Regions.id
ORDER BY org_name ASC
现在,作为我的开发项目的额外要求,我有一个表格,可以与像
这样的地区建立一对多的合作伙伴关系-- Destinations
-- ================================
-- id | partner_id | region_id
-- ================================
-- 1 | 1 | 1
-- 2 | 1 | 2
如果Dick Cheney
与区域Western Europe
和United States
相关联。如果可能的话,我想做的是修改GetPartnersWithRegion
,以便它们用逗号隔开这些目的地,例如
-- Results
-- =====================================================================================================================================================
-- id | first_name | last_name | org_name | email | region_name | destinations
-- =====================================================================================================================================================
-- 1 | 'Dick' | 'Cheney' | 'Haliburton' | 'DCheney@Haliburton.org' | 'United States' | 'Western Europe, United States'
-- 2 | 'Warren' | 'Buffet' | 'Berkshire Hathaway' | 'WarrenBridgemaster@bershire.org' | 'United States' | 'Latin America, 'Asia Pacific'
这可能吗?或者我是否应该采取不同的方式来做这件事?
答案 0 :(得分:2)
我们需要使用FOR XML
查询来构造逗号分隔列表,例如:
SELECT Partners.id,
Partners.first_name,
Partners.last_name,
Partners.org_name,
Partners.email,
Regions.name,
STUFF((SELECT ',' + r.name FROM regions r INNER JOIN destinations d ON (r.region_id = d.region_id AND d.partner_id = p.partner_id) FOR XML PATH('')),1,1,'') AS [Destinations]
FROM Partners p
答案 1 :(得分:0)
将行值连接成逗号分隔字符串的最佳技巧是使用FOR XML PATH()功能。很多例子,但我发现这很清楚:
http://sqlandme.com/2011/04/27/tsql-concatenate-rows-using-for-xml-path/