Получить текст через запятую из идентификаторов через запятую - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть две таблицы, tblStudent и tblDepartment.Я храню DeptIds в таблице ученика в форме значений, разделенных запятыми, например -

StudentId  DeptIds
1          1,2,3
2          4
3          1,5

Я хочу, чтобы названия отделов разделялись запятыми вместо DeptIds в моей процедуре GetById таблицы ученика.Любая помощь, пожалуйста?

1 Ответ

0 голосов
/ 18 декабря 2018

Во-первых, измените модель данных, чтобы она не включала 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

надеюсь, я помог!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...