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;
这个问题是因为有一个关于教授、系、课程和时间表的数据库。需要写一个查询 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;