Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 仅为缺少SQL成绩的学生插入成绩_Mysql_Sql_Insert_Cross Join - Fatal编程技术网

Mysql 仅为缺少SQL成绩的学生插入成绩

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

我是SQL新手,有一个问题:我必须检查每个学生是否都有所有的分数(1-10)。如果一个学生缺了一个分数,我必须插入它。但是任何学生都不应该有同一年级的复本——他们应该有一次

我所做的只是显示所有学生的成绩:

 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:我没有其他表格。我不能再创建一个表格了,我已经更新了我的答案来解决这个问题。请不要在评论中发布额外信息。如果你认为有必要,可以通过编辑将其添加到问题中。但请不要添加链接或图片,如果你想添加,请用文本代替。