SQL: Как получить курсы, как в бакалавриате, так и в магистратуре? - PullRequest
0 голосов
/ 29 октября 2018

Данные:

Programs  
- degree (name)  
- Course (course list)  

Degrees  
- code (unique identifier)  
- name  
- type (either postgrad or undergrad)  

Course  
- code (unique identifier)   
- name  

Итак, некоторые курсы существуют как в undergrad, так и в postgrad градусах, и я хотел бы знать, как получить все эти курсы.

Ответы [ 4 ]

0 голосов
/ 29 октября 2018

Я бы использовал пересечение:

select courses.name
from courses
inner join programs on programs.course = courses.name
inner join degrees on degrees.code = programs.degree
where degrees.type = 'UG'
intersect
select courses.name
from courses
inner join programs on programs.course = courses.name
inner join degrees on degrees.code = programs.degree
where degrees.type = 'PG';

Запрос выглядит следующим образом: выберите все курсы для студентов и пересекайте результат с курсами для аспирантов.

Если вы хотите только курсы для студентов, вы можете использовать except вместо пересечения (обменяйтесь двумя запросами и используйте except, если вы хотите только курсы для выпускников).

0 голосов
/ 29 октября 2018

Один метод агрегации:

select p.course
from program p inner join
     degrees d
     on d.Code = p.Degree
where d.type in ('postgrad', 'undergrad')
group by p.course
having count(distinct d.type) = 2;

Вам нужно присоединиться к course, только если вам нужно имя, а не код.

0 голосов
/ 29 октября 2018

Я бы сделал это с помощью двух подвыборов, как это:

SELECT c.name
from course C 
-- at least one postgrad programs/degrees for this course
inner join (
    select distinct p.course 
    from Program P inner join Degrees D on d_pg.Code=P.Degree 
    where D.Type = 'postgrad'
) as P_pg on C.Code=P_pg.Course
-- at least one undergrad programs/degrees for this course
inner join (
    select distinct p.course 
    from Program P inner join Degrees D on d_pg.Code=P.Degree 
    where D.Type = 'undergrad'
) as P_ug on C.Code=P_ug.Course
where 1=1
;
0 голосов
/ 29 октября 2018

Это должно помочь вам с вашим требованием,

SELECT C.Name
from
Program P
inner join Degrees D
on D.Code=P.Degree and (D.Type = 'postgrad' OR D.Type = 'undergrad')
inner join Course C
on C.Code=P.Course
group by C.Name
having count(*)>1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...