SQL Server字符串Concat与东西

时间:2016-03-08 13:53:29

标签: sql sql-server string tsql concat

我已经在网上看了几天如何在sql server上使用STUFF,我看到的大多数例子只涉及两个表而我的查询是通过3个表而我无法让它工作这是没有STUFF函数的查询,它获取了我想要的所有数据:

select c.category_name,r.role_name
from categories as c 
join role_categ as rc on c.category_id=rc.category_id 
join roles as r on r.role_id=rc.role_id
where rc.c_read='1';

These are the results

我想要的是你有一个Category_name然后我想要在第一行的一个单元格中的所有role_names:

BCM-Télécopieur-photocopieur Admin,Administation

这里我的东西功能但不起作用jsut给了我与其他查询相同的表

select c.category_name,STUFF((
    select ','+r.role_name
    from roles as r
    where rc.role_id=r.role_id
    for xml path('')),1,1,'')
from role_categ as rc
join categories as c on c.category_id=rc.category_id

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

这是我提出的一个版本。 @GiorgosBetsos是正确的,JOIN需要移动到内部查询。我不确定为什么他仍然看到重复,但以下查询按预期返回数据:

-- Set up the data
DECLARE @roles TABLE (role_id INT, role_name VARCHAR(20))
DECLARE @role_categories TABLE (category_id INT, role_id INT)
DECLARE @categories TABLE (category_id INT, category_name VARCHAR(20))

INSERT INTO @roles (role_id, role_name) VALUES (1, 'Admin'), (2, 'Administration'), (3, 'Tech')
INSERT INTO @categories (category_id, category_name) VALUES (1, 'Consultant'), (2, 'FTP'), (3, 'Logicals')
INSERT INTO @role_categories (category_id, role_id) VALUES (1, 1), (1, 2), (1, 3), (2, 1), (2, 3), (3, 1)

-- The query
SELECT
    C.category_name,
    STUFF((
        SELECT ',' + R.role_name
        FROM
            @role_categories RC
        INNER JOIN @roles R ON R.role_id = RC.role_id
        WHERE
            RC.category_id = C.category_id AND
            RC.c_read = 1
        FOR XML PATH('')), 1, 1, '')
FROM
    @categories C

答案 1 :(得分:2)

试试这个:

SELECT DISTINCT c_out.category_name,
       STUFF((SELECT ',' + r.role_name
              FROM roles as r
              INNER JOIN role_categ as rc ON rc.role_id=r.role_id
              WHERE rc_out.category_id=rc.category_id
              FOR XML PATH('')),1,1,'')
FROM role_categ AS rc_out
JOIN categories AS c_out ON c_out.category_id = rc_out.category_id
WHERE rc_out.c_read = '1'

您需要在子查询中使用JOINrole_categ表,以便与category_id相关联。此外,您必须在外部查询中使用DISTINCT以过滤掉重复的记录。