我已经在网上看了几天如何在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';
我想要的是你有一个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
任何帮助都将不胜感激。
答案 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'
您需要在子查询中使用JOIN
到role_categ
表,以便与category_id
相关联。此外,您必须在外部查询中使用DISTINCT
以过滤掉重复的记录。