Получить значения столбца, разделенные точкой с запятой - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть две таблицы в plsql

tblStudent: -

StudentId            Name  .........
1                    A
2                    B

tblDept: -

DeptId              DeptName       StudentId
1                   Dep Aero         1
2                   IT               1
3                   Dep Maths        1
4                   Dep Chemistry    2

Я хочу получить studentId со всеми его отделами, которыеначинается с 'Dep', разделенного точкой с запятой, если я передам, где StudentId = 1 в результате SELECT должен выглядеть как

StudentId         DeptName
  1               Dep Aero;Dep Maths

любая помощь, пожалуйста?

Ответы [ 5 ]

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

Если вам нужен пустой список отделов, когда у студента нет записей, вы можете использовать внешнее объединение между двумя таблицами, например:

select s.studentid,
 listagg(d.deptname, ';') within group (order by d.deptname) as deptnames
from tblstudent s
left join tbldept d on d.studentid = s.studentid
and deptname  like 'Dep%'
group by s.studentid;

Демонстрация с использованием CTE для ваших выборочных данных, включаяидентификатор третьего студента без соответствующих отделов:

-- CTEs for sample data
with tblstudent (studentid, name) as (
            select 1, 'A' from dual
  union all select 2, 'B' from dual
  union all select 3, 'C' from dual
),
tbldept (deptid, deptname, studentid) as (
            select 1, 'Dep Aero', 1 from dual
  union all select 2, 'IT', 1 from dual
  union all select 3, 'Dep Maths', 1 from dual
  union all select 4, 'Dep Chemistry', 2 from dual
)
-- actual query
select s.studentid,
 listagg(d.deptname, ';') within group (order by d.deptname) as deptnames
from tblstudent s
left join tbldept d on d.studentid = s.studentid
and deptname  like 'Dep%'
group by s.studentid;

 STUDENTID DEPTNAMES                     
---------- ------------------------------
         1 Dep Aero;Dep Maths            
         2 Dep Chemistry                 
         3                               

Ваша модель данных выглядит странной;у вас, вероятно, должна быть таблица отдела, в которой есть только идентификаторы и названия отделов, а затем еще одна таблица, которая связывает каждого учащегося со всеми его отделами - что-то вроде (снова в форме CTE):

-- CTEs for sample data
with tblstudent (studentid, name) as (
            select 1, 'A' from dual
  union all select 2, 'B' from dual
  union all select 3, 'C' from dual
),
tbldept (deptid, deptname) as (
            select 1, 'Dep Aero' from dual
  union all select 2, 'IT' from dual
  union all select 3, 'Dep Maths' from dual
  union all select 4, 'Dep Chemistry' from dual
),
tblstudentdept (studentid, deptid) as (
  select 1, 1 from dual
  union all select 1, 2 from dual
  union all select 1, 3 from dual
  union all select 2, 4 from dual
)
-- actual query
select s.studentid,
 listagg(d.deptname, ';') within group (order by d.deptname) as deptnames
from tblstudent s
left join tblstudentdept sd on sd.studentid = s.studentid
left join tbldept d on d.deptid = sd.deptid
and deptname  like 'Dep%'
group by s.studentid;

 STUDENTID DEPTNAMES                     
---------- ------------------------------
         1 Dep Aero;Dep Maths            
         2 Dep Chemistry                 
         3                               

В любом случае, если вы хотите видеть результаты только одного учащегося, когда добавляете его как предложение where, прямо перед group by:

...
where s.studentid = 1
group by s.studentid;
0 голосов
/ 28 декабря 2018

Нет join необходимо для вашего запроса.Если вы хотите сделать это для конкретного студента с идентификатором:

select listagg(d.DeptName, ';') within group (order by d.DeptName) 
from tblDept d 
where d.studentid = :studentid and
      d.DeptName like 'Dep%';
0 голосов
/ 28 декабря 2018

Вы можете использовать LISTAGG для объединения и LIKE для фильтрации записей.

SELECT studentid,
       LISTAGG(deptname,';') WITHIN GROUP(
            ORDER BY deptid
       ) as deptname
FROM t
WHERE deptname LIKE 'Dep%'
GROUP BY studentid;
0 голосов
/ 28 декабря 2018

Вы можете использовать это:

select 
   st.studentid,
   listagg(d.DeptName,';') within group( order by d.DeptName ) 
From tblStudent st
join tblDept d on d.studentid = st.studentid
where DeptName  like 'Dep%'
group by st.studentid

sqlFiddle

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

Попробуйте это GROUP_CONCAT -

SELECT stud2.studentId,
CAST((SELECT GROUP_CONCAT(CONCAT(dep.depName,'; ') FROM  tblDept dep 
INNER JOIN tblStudent stud ON (stud.DeptId = dep.DeptId)))
FROM tblStudent stud2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...