Mysql 仅为缺少SQL成绩的学生插入成绩
我是SQL新手,有一个问题:我必须检查每个学生是否都有所有的分数(1-10)。如果一个学生缺了一个分数,我必须插入它。但是任何学生都不应该有同一年级的复本——他们应该有一次 我所做的只是显示所有学生的成绩:Mysql 仅为缺少SQL成绩的学生插入成绩,mysql,sql,insert,cross-join,Mysql,Sql,Insert,Cross Join,我是SQL新手,有一个问题:我必须检查每个学生是否都有所有的分数(1-10)。如果一个学生缺了一个分数,我必须插入它。但是任何学生都不应该有同一年级的复本——他们应该有一次 我所做的只是显示所有学生的成绩: SELECT CONCAT(studentdata.FirstName,studentdata.LastName) AS 'Name', grade.Grade FROM studentdata CROSS JOIN grade WHERE studentdata.Id = grad
SELECT CONCAT(studentdata.FirstName,studentdata.LastName) AS 'Name', grade.Grade
FROM studentdata
CROSS JOIN grade
WHERE studentdata.Id = grade.IdStudent
ORDER BY Name
如果表
gradelevels
只有一列(Grade
)和可能的等级值(1、2、3、…、10),则可以这样做:
INSERT INTO grade
SELECT
studentdata.Id AS IdStudent,
gradelevels.Grade AS Grade
FROM studentdata -- Get all the students,
CROSS JOIN gradelevels -- one time for each possible grade.
LEFT JOIN grade ON
-- Now we will know what (student, grade) combinations have an entry in grade.
studentdata.Id = grade.IdStudent AND gradelevels.Grade = grade.Grade
WHERE grade.IdStudent IS NULL -- Only take the rows where there isnt already a grade.
如果您不想有一个包含GradeLevel的特定表,您可以用以下内容替换交叉连接GradeLevel
:
CROSS JOIN (SELECT Grade FROM grade GROUP BY Grade) gradelevels
选择
将为您提供所有使用的分数,因此,如果有某个分数未用于任何学生,则不会插入该分数
我建议您在表
Grade
中的IdStudent
和Grade
上有一个唯一的索引(或将它们作为主键),以确保没有学生有两次相同的成绩。如果您的表Grade levels
中只有一列(Grade
),其中有可能的成绩值(1,2,3,…,10)您可以这样做:
INSERT INTO grade
SELECT
studentdata.Id AS IdStudent,
gradelevels.Grade AS Grade
FROM studentdata -- Get all the students,
CROSS JOIN gradelevels -- one time for each possible grade.
LEFT JOIN grade ON
-- Now we will know what (student, grade) combinations have an entry in grade.
studentdata.Id = grade.IdStudent AND gradelevels.Grade = grade.Grade
WHERE grade.IdStudent IS NULL -- Only take the rows where there isnt already a grade.
如果您不想有一个包含GradeLevel的特定表,您可以用以下内容替换交叉连接GradeLevel
:
CROSS JOIN (SELECT Grade FROM grade GROUP BY Grade) gradelevels
选择
将为您提供所有使用的分数,因此,如果有某个分数未用于任何学生,则不会插入该分数
我建议您在表
Grade
中的IdStudent
和Grade
上有一个唯一索引(或将它们作为主键),以确保没有学生有两次相同的成绩。您可以通过此查询查看所有有成绩或没有成绩的学生:
Select CONCAT(sd.FirstName,sd.LastName) AS 'Name', grade.Grade
from studentdata sd
left outer join grade
on sd.Id = grade.IdStudent
如果您必须只看到没有成绩的学生:
Select CONCAT(sd.FirstName,sd.LastName) AS 'Name', grade.Grade
from studentdata sd
left outer join grade
on sd.Id = grade.IdStudent
WHERE ISNULL(grade.Grade, -1000) = -1000
最后插入默认等级“5”:
由于您的成绩表似乎包含所有作业的所有成绩,您希望在where语句中添加一个“andgrade.assigmentid=您可以通过此查询查看所有有成绩或无成绩的学生:
Select CONCAT(sd.FirstName,sd.LastName) AS 'Name', grade.Grade
from studentdata sd
left outer join grade
on sd.Id = grade.IdStudent
如果您必须只看到没有成绩的学生:
Select CONCAT(sd.FirstName,sd.LastName) AS 'Name', grade.Grade
from studentdata sd
left outer join grade
on sd.Id = grade.IdStudent
WHERE ISNULL(grade.Grade, -1000) = -1000
最后插入默认等级“5”:
由于您的成绩表似乎包含所有作业的所有成绩,因此您需要在where语句中添加一个“andgrade.assigmentid=mysql或sql swerver?mysql。对不起,我给错了标签
我必须插入缺失的分数如何确定这个评分?好吧…首先我必须检查学生的每个分数,如果缺少分数,我必须插入它。但是我不知道怎么做…“我不能得到重复的分数”你的意思是两个不同的学生不能有相同的分数吗?mysql或SQLServer?mysql。对不起,我给错了标签我必须插入缺失的分数如何确定这个评分?好吧…首先我必须检查学生的每个分数,如果缺少分数,我必须插入它。但是我不知道怎么做…“我不能得到重复的分数”你是说两个不同的学生不能有相同的分数吗?为什么ISNULL(grade.grade,-1000)=-1000
而不是grade.grade是NULL
?此外,我认为每个学生都应该有所有的分数(1-10),而不仅仅是默认的5分。但不确定,因为问题有点不清楚。是的。每个学生都必须有所有的分数。比如这里:这是我必须在结尾处提供的信息。我建议你将这些信息添加到你的问题中(但不是作为图片),而不是仅仅在评论中发布。为什么ISNULL(grade.grade,-1000)=-1000
而不是grade.grade为NULL
?此外,我认为每个学生都应该有所有的分数(1-10),而不仅仅是默认的5分。但不确定,因为问题有点不清楚。是的。每个学生都必须有所有的分数。比如这里:这是我必须在末尾的内容。我建议你将这些信息添加到你的问题中(但不是图片),而不是仅仅在评论中发布。my studentdata表:my grade表:我没有其他表。我不能再创建一个表格了,我已经更新了我的答案来解决这个问题。请不要在评论中发布额外信息。如果你认为有必要,可以通过编辑将其添加到问题中。但是请不要添加链接或图片,如果您想添加,请用文本代替。my studentdata table:my grade table:我没有其他表格。我不能再创建一个表格了,我已经更新了我的答案来解决这个问题。请不要在评论中发布额外信息。如果你认为有必要,可以通过编辑将其添加到问题中。但请不要添加链接或图片,如果你想添加,请用文本代替。