2013-03-26 57 views
3

我想要一个查询输出1行左侧表中的Id和来自连接表的描述。字符串当量的总和连接

架构:

person 
---------  
id (int) 

role 
------------- 
id (int) 
description (varchar(100)) 

personrole 
------------- 
personid (int) 
roleid (int) 

实施例的数据:

person 
------------ 
id 
1 
2 

role 
------------ 
id description 
1 user 
2 admininstrator 
3 tester 

personrole 
------------- 
personid roleid 
1   1 
2   1 
2   2 
2   3 

所以,希望我的输出为:

PersonId Roles 
1   user 
2   user;administrator;tester 

回答

10
SELECT 
    p.ID PersonID, 
    STUFF(
     (SELECT ';' + b.description 
      FROM personrole a 
       INNER JOIN role b 
        ON a.roleid = b.id 
      WHERE a.personid = p.id 
      FOR XML PATH ('')) 
      , 1, 1, '') AS DescriptionList 
FROM person AS p 
GROUP BY p.ID 

OUTPUT

╔══════════╦════════════════════════════╗ 
║ PERSONID ║  DESCRIPTIONLIST  ║ 
╠══════════╬════════════════════════════╣ 
║  1 ║ user      ║ 
║  2 ║ user;admininstrator;tester ║ 
╚══════════╩════════════════════════════╝ 
+0

感谢您的。作品一种享受。 – 2013-03-26 10:09:18

+0

+1为SQLFiddle链接,之前不知道该服务。 – Touko 2013-10-29 10:03:52

1

一个其他SQL例如:使用GROUP_CONCAT上单个表组的一个小镇的每个名字的客户端。

脚本SQLite的:

表:

CREATE TABLE IF NOT EXISTS 'user'(
     prenom STRING, 
     age INTEGER, 
     ville STRING); 

数据:

INSERT INTO 'user' ('prenom', 'age', 'ville') VALUES 
     ('Anthony', 20, 'Toulouse'), 
     ('Clarisse', 18, 'Paris'), 
     ('Madeleine', 58, 'Paris'), 
     ('Jacques', 45, 'Toulouse'), 
     ('Henry', 26, 'Toulouse'), 
     ('Lili', 14, 'Nice'), 
     ('Victoire', 38, 'Paris'); 

正常选择:

SELECT * FROM 'user'; 

OUTPUT:

prenom age ville 

-------- -- --------- 
Anthony 20 Toulouse 
Clarisse 18 Paris 
Madeleine 58 Paris 
Jacques 45 Toulouse 
Henry  26 Toulouse 
Lili  14 Nice 
Victoire 38 Paris 

所有prenom组由威乐:

SELECT ville, GROUP_CONCAT(prenom, ',') FROM user GROUP BY ville;

OUTPUT:

ville  liste 
-------- --------- 
Nice  Lili 
Paris  Clarisse,Madeleine,Victoire 
Toulouse Anthony,Jacques,Henry 
+0

对于像我这样的人,只是一个说明这是一个MySQL的答案,但问题是MS SQL Server。 – Paul 2015-12-21 10:33:35