将多个结果合并到一列
Merge multiple results to one Column
我想创建一个 select 语句来将多个结果合并为一个 rot
我能够通过 PHP 实现我想要的东西,但我认为应该可以直接使用 Sql。
Notes
| ID | Name |
|----|------|
| 2 | Test |
| 3 | Test |
EditorAssignment
| UserID | NoteID |
|--------|--------|
| 1 | 2 |
| 2 | 2 |
UserList
| ID | username |
|----|----------|
| 1 | testuser |
| 2 | bUser |
| 3 | cUser |
我想要以下结果:
| NoteID | User |
|--------|-----------------|
| 2 | testuser, bUser |
| 3 | cUser |
如何在 SQL2012 中创建一个 select?
在 SQL Server 2017(为此具有 STRING_AGG 聚合函数)之前,您需要使用著名的 FOR XML PATH
相关子查询:
设置:
DECLARE @Notes TABLE (ID INT, Name VARCHAR(10))
INSERT INTO @Notes (ID, Name)
VALUES (2, 'Test'), (3, 'Test')
DECLARE @EditorAssignment TABLE (UserID INT, NoteID INT)
INSERT INTO @EditorAssignment (UserID, NoteID)
VALUES (1, 2), (2, 2),
(3, 3) -- Added missing row here
DECLARE @UserList TABLE (ID INT, username VARCHAR(100))
INSERT INTO @UserList (ID, username)
VALUES (1, 'testuser'), (2, 'bUser'), (3, 'cUser')
查询:
SELECT
NoteID = N.ID,
[User] = STUFF(
(
SELECT
', ' + U.username
FROM
@EditorAssignment AS E
INNER JOIN @UserList AS U ON E.UserID = U.ID
WHERE
N.ID = E.NoteID -- Link the outmost Notes' note with the inner EditorAssignment (correlated subquery)
FOR XML
PATH ('') -- FOR XML PATH('') makes the SELECT return a string value, not a result set
),
1,
2,
'')
FROM
@Notes AS N
结果:
NoteID User
2 testuser, bUser
3 cUser
子查询生成一个字符串,其中包含每个注释的相关分配的每个用户名。
STUFF
函数仅用于替换第一个 ', '
,因为该字符串是使用前导逗号和 space 构建的。这就是为什么 STUFF 的参数是 1(字符串的第一个位置)、2(要删除的位置、逗号和 space)和 ''
(替换那些字符)。
我猜您的示例中 EditorAssignment
table 缺少一行,其中包含值 3, 3
。
我想创建一个 select 语句来将多个结果合并为一个 rot
我能够通过 PHP 实现我想要的东西,但我认为应该可以直接使用 Sql。
Notes
| ID | Name |
|----|------|
| 2 | Test |
| 3 | Test |
EditorAssignment
| UserID | NoteID |
|--------|--------|
| 1 | 2 |
| 2 | 2 |
UserList
| ID | username |
|----|----------|
| 1 | testuser |
| 2 | bUser |
| 3 | cUser |
我想要以下结果:
| NoteID | User |
|--------|-----------------|
| 2 | testuser, bUser |
| 3 | cUser |
如何在 SQL2012 中创建一个 select?
在 SQL Server 2017(为此具有 STRING_AGG 聚合函数)之前,您需要使用著名的 FOR XML PATH
相关子查询:
设置:
DECLARE @Notes TABLE (ID INT, Name VARCHAR(10))
INSERT INTO @Notes (ID, Name)
VALUES (2, 'Test'), (3, 'Test')
DECLARE @EditorAssignment TABLE (UserID INT, NoteID INT)
INSERT INTO @EditorAssignment (UserID, NoteID)
VALUES (1, 2), (2, 2),
(3, 3) -- Added missing row here
DECLARE @UserList TABLE (ID INT, username VARCHAR(100))
INSERT INTO @UserList (ID, username)
VALUES (1, 'testuser'), (2, 'bUser'), (3, 'cUser')
查询:
SELECT
NoteID = N.ID,
[User] = STUFF(
(
SELECT
', ' + U.username
FROM
@EditorAssignment AS E
INNER JOIN @UserList AS U ON E.UserID = U.ID
WHERE
N.ID = E.NoteID -- Link the outmost Notes' note with the inner EditorAssignment (correlated subquery)
FOR XML
PATH ('') -- FOR XML PATH('') makes the SELECT return a string value, not a result set
),
1,
2,
'')
FROM
@Notes AS N
结果:
NoteID User
2 testuser, bUser
3 cUser
子查询生成一个字符串,其中包含每个注释的相关分配的每个用户名。
STUFF
函数仅用于替换第一个 ', '
,因为该字符串是使用前导逗号和 space 构建的。这就是为什么 STUFF 的参数是 1(字符串的第一个位置)、2(要删除的位置、逗号和 space)和 ''
(替换那些字符)。
我猜您的示例中 EditorAssignment
table 缺少一行,其中包含值 3, 3
。