【问题标题】:Is it possible to write a T-SQL query that does this?是否可以编写一个执行此操作的 T-SQL 查询?
【发布时间】:2016-02-18 00:52:25
【问题描述】:

我有这样的桌子

--        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'

这可能吗?还是我应该首先以不同的方式执行此操作?

【问题讨论】:

标签: sql sql-server tsql database-design


【解决方案1】:

我们需要使用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

【讨论】:

    【解决方案2】:

    将行值连接成逗号分隔字符串的最佳技巧是使用 FOR XML PATH() 功能。有很多例子,但我发现这很清楚:

    http://sqlandme.com/2011/04/27/tsql-concatenate-rows-using-for-xml-path/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多