下面的代码完全错误,根本不起作用。我基本上是在尝试查看我的表格并为一个部门拥有超过 40 名学生的部门编制一份 DeptName 列表和总学生人数。
我对联接感到困惑,如果有人可以解释并指出我哪里出错了。我确定还有其他问题,所以对他们的任何帮助都会有所帮助
所以基本上一个系连接到一个模块,一个学生注册一个模块。学生不能在其系外学习模块。所以每个学生应该有一个模块连接到一个部门
其他表中的所有 ID 字段都是外键,因为您可以猜到,更改表不是我想要在这里做的,我只想按原样执行此查询
相关表格列
餐桌部 DeptID
、DeptName
、Faculty
、Address
表格模块 ModuleID
、ModuleName
、DeptID
、Programme
表学生 StudentID
,StudentName
,DoB
,Address
,StudyType
,`
表格注册 EID
,StudentID
,ModuleID
,Semester
,Year
SELECT Department.DeptName, COUNT(Student.StudentID) AS 'No of Students' FROM Department LEFT JOIN Module ON Department.DeptID= Module.DeptID LEFT JOIN Enrolment ON Module.ModuleID= Enrolment.StudentID LEFT JOIN Student.StudentID
GROUP BY(Department.DeptID)
HAVING COUNT(Student.StudentID)>=40
我没有把每张桌子都包括在内,因为有很多。
但是,除非我完全弄错了,否则您不需要访问他们教授的模块的员工表中的 ModuleID 或根本与此无关的内容。因为那里没有学生或系的详细信息。
如果是这样的话,我会很快修复它。
答案 0 :(得分:1)
SELECT Department.DeptName, COUNT(Student.StudentID) AS 'No of Students'
FROM Department
LEFT JOIN Module
ON Department.DeptID= Module.DeptID
LEFT JOIN Enrolment
-- problem #1:
ON Module.ModuleID= Enrolment.StudentID
-- problem #2:
LEFT JOIN Student.StudentID
-- problem #3:
GROUP BY(Department.DeptID)
HAVING COUNT(Student.StudentID)>=40
USING
而不是 ON
进行连接JOIN
运算符的右侧都必须是表,而不是列。COUNT
)的每一列进行分组。我建议您选择 DeptID 而不是名称,然后使用此查询的结果在后续选择中查找名称。注意:以下代码未经测试。
WITH bigDepts AS (
SELECT DeptId, COUNT(StudentID) AS StudentCount
FROM Department
JOIN Module
USING ( DeptID )
JOIN Enrolment
USING ( ModuleID )
JOIN Student
USING ( StudentID )
GROUP BY DeptID
HAVING COUNT(StudentID)>=40
)
SELECT DeptID, DeptName, StudentCount
FROM Department
JOIN bigDepts
USING ( DeptID )
答案 1 :(得分:0)
您需要使用 left join
而不是 inner join
,因为您只需要从这三个表中选择相关行。
Groupy by
和 having
子句看起来不错。由于您需要拥有超过 40 名学生的部门而不是 >=
,请使用 COUNT(e.StudentID)>40
SELECT d.DeptName, COUNT(e.StudentID) AS 'No of Students' FROM Department d INNER JOIN Module m ON d.DeptID= m.DeptID inner JOIN Enrolment e ON m.ModuleID= e.StudentID LEFT JOIN Student.StudentID
GROUP BY(d.DeptName)
HAVING COUNT(e.StudentID)>40
答案 2 :(得分:0)
所以你的 join 子句在你写的时候对 students
有点不确定,大概这些应该都是内连接。
我已经使用别名重新格式化了您的查询以使其更易于阅读。
由于您要计算每个 DeptName 的行数,因此您只需执行 count(*)
,同样在您的 having
中,您只需要计数大于 40。如果没有看到您的架构和数据,就不可能知道您是否可能有重复的学生,如果是这种情况并且您希望不同的学生计数可以修改为 count(distinct s.studentId)
select d.DeptName, Count(*) as 'No of Students'
from Department d
join Module m on m.DeptId=d.DeptId
join Enrolment e on e.StudentId=m.ModuleId
join Students s on s.StudentId=e.studentId
group by(d.DeptName)
having Count(*)>40
另外,看看你的加入条件,Enrolement 表是相关的吗?
select d.DeptName, Count(*) as 'No of Students'
from Department d
join Module m on m.DeptId=d.DeptId
join Students s on s.StudentId=m.moduleId
group by(d.DeptName)
having Count(*)>40