是否可以编写执行此操作的T-SQL查询?

时间:2016-02-18 00:52:25

标签: sql sql-server tsql database-design

我有像

这样的表格
--        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 EuropeUnited 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'

这可能吗?或者我是否应该采取不同的方式来做这件事?

2 个答案:

答案 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/