使用单个查询连接多个表

时间:2012-11-01 13:33:16

标签: sql oracle jdbc oracle11g

学生

student_id  FirstName   LastName
---------------------------------------------------
1           Joe         Bloggs
2           Alan        Day
3           David       Johnson

Student_Course

course_id   student_id  courseName
---------------------------------------------------             
1           1           Computer Science
2           1           David Beckham Studies
3           1           Geography   
1           3           Computer Science
3           3           Geography   

Student_clubs

club_id student_id  club_name               club_count
---------------------------------------------------
1       1           Footbal                     10
2       1           Rugby                       10
3       1           Syncronized Swimming        10
4       3           Tennis                      15

在上面的例子中,id = 1的学生需要3门课程,并且是3个俱乐部的一部分 如果我要找出学生参与哪些课程或学生参加哪个俱乐部,我可以这样做,但我需要提出两个问题。是否可以针对。运行单个查询 上面列出的表格,以便结果如下:

输出

student_id      FirstName       Student_associated_courses          Student_associated_clubs 
---------------------------------------------------------------------------
1               Joe             1,2,3                               Football, Rugby, Syncronized swimming
3               David           1,3                                 Tennis

是否可以通过一个查询获得上述输出?我正在使用JDBC来获取数据,所以我试图看看我是否可以避免多次访问以获取必要的数据。

2 个答案:

答案 0 :(得分:2)

GROUP_CONCAT

中使用DISTINCTMySQL
SELECT  a.student_ID, a.firstname,
        GROUP_CONCAT(DISTINCT b.course_ID),
        GROUP_CONCAT(DISTINCT  c.club_name)
FROM    student a
        INNER JOIN student_Course b
            ON a.student_id = b.student_ID
        INNER JOIN student_clubs c
            ON a.student_ID = c.student_ID
GROUP BY    a.student_ID, a.firstname

答案 1 :(得分:2)

试试这样:

SELECT *
FROM Student s JOIN
(SELECT sc."student_id", listagg(sc."course_id", ',')within group(ORDER BY sc."course_id")
FROM Student_Course sc
GROUP BY sc."student_id") s_course ON s."student_id"=s_course."student_id"
JOIN (SELECT sl."student_id", listagg(sl."club_name", ',')within GROUP(ORDER BY sl."club_name")
     FROM Student_clubs sl
     GROUP BY sl."student_id") s_club ON s."student_id"=s_club."student_id"

“catch”是LISTAGG不能与DISTINCT关键字一起使用

Here是一个小提琴