获取以半冒号分隔的列值

时间:2018-12-28 11:12:58

标签: sql oracle

我在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”开头,并用半冒号分隔,如果我通过,则SELECT结果中的StudentId = 1应该看起来像

StudentId         DeptName
  1               Dep Aero;Dep Maths

有什么帮助吗?

5 个答案:

答案 0 :(得分:4)

您可以使用LISTAGG进行合并,并使用LIKE来过滤记录。

SELECT studentid,
       LISTAGG(deptname,';') WITHIN GROUP(
            ORDER BY deptid
       ) as deptname
FROM t
WHERE deptname LIKE 'Dep%'
GROUP BY studentid;

答案 1 :(得分:0)

尝试使用此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

答案 2 :(得分:0)

您可以单独使用此

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

答案 3 :(得分:0)

您的查询不需要join。如果要对特定的学生证执行此操作:

select listagg(d.DeptName, ';') within group (order by d.DeptName) 
from tblDept d 
where d.studentid = :studentid and
      d.DeptName like 'Dep%';

答案 4 :(得分:0)

如果在学生没有任何条目的情况下想要一个空的部门列表,则可以在两个表之间使用外部联接,例如:

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进行样本数据演示,包括没有匹配部门的第三个学生ID:

-- 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                               

您的数据模型看起来有些奇怪;您应该有一个部门表,其中只包含部门ID和名称,然后是另一个表,将每个学生链接到其所有部门-类似于(再次以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;
相关问题