Я использую SQL Server. Ищите функциональность, аналогичную функциям GROUP_CONCAT
или listagg
, предоставляемым в других базах данных. Похоже, функция STUFF
предназначена для объединения строк. Вот моя попытка.
SELECT Employee.Id, Employee.First,
STUFF((
SELECT '' + Role.Id
FROM Role
WHERE EmployeeRole.RoleId = Role.Id
FOR XML PATH('')), 1, 0, '') AS RoleIds,
From Employee
INNER JOIN EmployeeRole ON Employee.Id = EmployeeRole.EmployeeId
INNER JOIN Role ON EmployeeRole.RoleId = Role.Id
ORDER BY Employee.Id;
Сотрудник
+----+-------+------+
| Id | First | Last |
+----+-------+------+
| 1 | John | Doe |
| 2 | Jane | Doe |
+----+-------+------+
Роль
+----+-------+
| Id | Name |
+----+-------+
| 1 | Role1 |
| 2 | Role2 |
| 3 | Role3 |
| 4 | Role4 |
+----+-------+
EmployeeRole
+------------+--------+
| EmployeeId | RoleId |
+------------+--------+
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
| 2 | 3 |
| 2 | 4 |
+------------+--------+
Ожидаемый результат
+------------+-------+---------+-------------------+
| EmployeeId | First | RoleIds | RoleNames |
+------------+-------+---------+-------------------+
| 1 | John | 1,2 | Role1,Role2 |
| 2 | Jane | 2,3,4 | Role2,Role3,Role4 |
+------------+-------+---------+-------------------+