SQL 查询不同的教授和课程

SQL query for distinct professors and courses

这个问题是因为有一个关于教授、系、课程和时间表的数据库。需要写一个查询 returns 所有教授的名字和他们各自的课程。每行必须包含教授的姓名,后跟教授教授的课程名称。就行而言,必须没有重复项。

根据 table 名称和字段,我拥有的架构:

PROFESSOR: ID, NAME, DEPARTMENT_ID, SALARY
DEPARTMENT: ID, NAME
COURSE: ID, NAME, DEPARTMENT_ID, CREDITS
SCHEDULE: PROFESSOR_ID, COURSE_ID, SEMESTER, YEAR

我现在的代码:

SELECT DISTINCT p.Name AND c.NAME
FROM Prodessor p, Course c, Schedule S

WHERE
    p.DEPARTMENT_ID = c.DEPARTMENT_ID
    AND
    p.ID = s.PROFESSOR_ID
    AND
    c.ID = c.COURSE_ID

我得到的结果是所有教授的列表,但没有多门课程,只有一门。这里出了什么问题?它还提到 PROFESSOR.ID 对于 COURSE.PROFESSOR_ID 是外来的,所以 p.ID = s.PROFESSOR_ID 是有效的

您似乎需要 left join 而不是 inner join。我认为你不需要 distinct() 和这种信息

select distinct p.Name, c.Name, s.*
from schedules s
left join Professor p on p.id = s.professor_id
inner join Department d on d.department_id = p.department_id
left join Course c on c.professor_id = p.id

但如果您只想要教授和课程信息,假设有一些教授还没有时间表。 所以还没有 course 信息。

select distinct p.Name, c.Name
from Professor s
left join Course c on c.professor_id = p.id

我会在这里使用左连接,并且只涉及教授和课程表。

SELECT
    p.NAME,
    COALESCE(c.COURSE_ID, 'no courses available') AS COURSE_ID
FROM PROFESSOR p
LEFT JOIN COURSE c
    ON p.ID = c.PROFESSOR_ID
ORDER BY
    p.NAME;

如果给定的教授没有与他相关的课程,左侧的加入选项可以让我们显示一条消息。

我认为下面的代码可以解决您的需求

SELECT distinct p.name,c.name
from Professor p 
inner join Schedule s on p.id=s.professor_id
inner join course c on c.id=s.course_id;

或者,如果我们想要教授在其系外教授(或已经教授)的课程名称。

select distinct p.name, c.name
FROM professor p
JOIN schedule s on s.professor_id = p.id
JOIN course c on s.course_id = c.id
WHERE c.department_id <> p.department_id;