SQL 服务器字符串与内容连接

SQL Server String Concat with Stuff

我已经在网上看了几天如何在 sql 服务器上使用 STUFF,我看到的大多数示例只涉及两个 table,而我的查询正在经历 3 tables,我只是无法让它工作这里是没有 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';

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

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

这是我对 stuff 函数所拥有但不起作用的东西,它给了我与其他查询相同的 table

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

如有任何帮助,我们将不胜感激。

试试这个:

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 table,以便您可以关联到 category_id。此外,您必须在外部查询中使用 DISTINCT 以过滤掉重复的记录。

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

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