Во-первых, измените модель данных, чтобы она не включала DeptIds
значения столбца CSV
Это крайне непрактично, как вы можете заметить по вашей проблеме, которая никогда не возникнет при использовании более качественной модели данных.
Я бы порекомендовал следующую модель данных:
- tblStudent таблица с минимальными данными учащегося (идентификатор, имя, фамилия, дата_ф_бирта ...)
- tblDepartment таблица с минимальными данными отдела (id, имя_депта, dept_group ...)
- tblStudentDept в качестве средней таблицы с подключением данных (StudentId, DeptId, ActivityInd, date_from, date_until ...)
Таким образом, вы будете использовать таблицу tblStudentDept
, чтобы построчно хранить данные о ролях студентов на конкретных кафедрах:
ID StudentId DeptIds
1 1 1
2 1 2
3 1 3
4 2 4
5 3 1
6 3 5
После этого вы можетепокажите свои данные CSV, используя LISTAGG
функцию
Для идентификаторов, как у вас было раньше:
Код с образцом тестовых данных в WITH AS
:
WITH tblStudentDept AS(
select 1 as id, 1 as StudentID, 1 as DeptID from dual
union all
select 2 as id, 1 as StudentID, 2 as DeptID from dual
union all
select 3 as id, 1 as StudentID, 3 as DeptID from dual
union all
select 4 as id, 2 as StudentID, 4 as DeptID from dual
union all
select 5 as id, 3 as StudentID, 1 as DeptID from dual
union all
select 6 as id, 3 as StudentID, 5 as DeptID from dual
)
SELECT sd.StudentID, LISTAGG(DeptID, ',') WITHIN GROUP (ORDER BY sd.DeptID)
FROM tblStudentDept sd
GROUP BY sd.StudentID;
Для названий отделов, как вы просили:
Трескаe с образцом тестовых данных в WITH AS
, с использованием соединения между вашей таблицей tblDepartment
и, возможно, вновь созданной таблицей tblStudentDept
:
WITH tblStudentDept AS(
select 1 as id, 1 as StudentID, 1 as DeptID from dual
union all
select 2 as id, 1 as StudentID, 2 as DeptID from dual
union all
select 3 as id, 1 as StudentID, 3 as DeptID from dual
union all
select 4 as id, 2 as StudentID, 4 as DeptID from dual
union all
select 5 as id, 3 as StudentID, 1 as DeptID from dual
union all
select 6 as id, 3 as StudentID, 5 as DeptID from dual
),
tblDepartment AS(
select 1 as DeptId, 'Dept-1' as DeptName from dual
union all
select 2 as DeptId, 'Dept-2' as DeptName from dual
union all
select 3 as DeptId, 'Dept-3' as DeptName from dual
union all
select 4 as DeptId, 'Dept-4' as DeptName from dual
union all
select 5 as DeptId, 'Dept-5' as DeptName from dual
)
SELECT sd.StudentID, LISTAGG(d.DeptName, ',') WITHIN GROUP (ORDER BY sd.DeptID) as DeptNames
FROM tblStudentDept sd
JOIN tblDepartment d
ON (d.DeptId = sd.DeptId)
GROUP BY sd.StudentID;
Вывод кода:
StudentId DeptNames
1 Dept-1,Dept-2,Dept-3
2 Dept-4
3 Dept-1,Dept-5
надеюсь, я помог!