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'
您需要在子查询中 JOIN
到 role_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
我已经在网上看了几天如何在 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'
您需要在子查询中 JOIN
到 role_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