2013-03-22 56 views
-1

我很难理解创建视图TRANSCRIPTVIEW如何设置0的等级为没有参加课程的人。解释会有所帮助,解决方案和问题在下面。谢谢。不能理解这个视图在SQL中的工作原理

学生(ID,姓名) 成绩单(StudId,CourseName,学期级)

制定在SQL下面的查询: 创建所有的学生名单(ID,姓名),对于每一个学生,列出S2002学期所采取课程的平均成绩。 请注意,在S2002中可能会有学生没有参加任何课程。对于这些,平均等级应该被列为0. 解决方案: 我们首先创建一个视图,用行填充行,将每个学生注册为0级的零课程。因此,在学期内没有参加任何活动的学生'S2002'的这个学期的平均成绩为0。

以下是我困惑,这是如何工作,为什么它的工作?

CREATE VIEW TRANSCRIPTVIEW AS (

(SELECT * FROM Transcipt) 
UNION 
( 
SELECT S.Id,NULL,’S2002’,0 
FROM Student S) 
WHERE S.Id NOT IN ( 
SELECT T.StudId 
FROM Transcript T 
WHERE T.Semester = ’S2002’)) 
) 

Remaining solution: 
SELECT S.Id, S.Name, AVG(T.Grade) 
FROM Student S, TRANSCRIPTVIEW T 
WHERE S.Id = T.StudId AND T.Semester = ’S2002’ GROUP BY S.Id 
+0

表成绩单必须包含4个领域。如果有人要添加第五名,这将打破。第一个选择是获取所有成绩单。第二个选择是让所有没有记录的学生在S2002学期的成绩单中给他们分配第四个列值为0和课程名称为null – xQbert 2013-03-22 18:04:27

回答

1

how the create view, TRANSCRIPTVIEW, manages to set the grade of 0 for those who did not take a course

设定谁没有参加课程在学期S2002的学生在该学期成绩单表中没有记录。那个学期确实参加过课程的学生在该学期的表中确实有记录。查询供应值NULL, 'S2002',0学生,如果他们不为学期S2002的成绩单表:

SELECT S.Id,NULL,’S2002’,0 FROM Student S) -- this parenthesis is wrong 
    -- this following where conditions looks for students NOT IN the 2002 subset: 
    WHERE S.Id NOT IN 
    -- this next part gets a list of studentids for semester 2002 
    ( 
    SELECT T.StudId FROM Transcript T 
    WHERE T.Semester = ’S2002’ 
    ) 
+0

我还是不明白它是如何搜索整个数据库的,我没有看到一个循环 – NoNameY0 2013-03-22 18:25:45

+0

执行这个查询:'select s.id,'dog'as Student S'最喜欢的动画 – Tim 2013-03-22 19:07:36

+0

Select返回一个SET,不需要循环SQL是非pro cedural。该选择是针对学生表发出的,并且每个在2002年成绩单中不存在的学生都由该选择返回;这些提供的值是由select所返回的每一行提供的。 – Tim 2013-03-22 19:12:06

0

在你的想法中的解决方案是荒谬的。更好的解决方案是:

SELECT S.Id, S.Name, AVG(case when T.Semester = ’S2002’ then T.Grade end) as AvgS2002Grade 
FROM Student S left outer join 
    TRANSCRIPTVIEW T 
    on S.Id = T.StudId AND T.Semester = ’S2002’ 
GROUP BY S.Id 

您的问题中的查询过于复杂。它使用union(出于性能考虑,应该确实是union all),以确保包括所有学生。天哪,这是left outer join的用途。当条件聚合更合适时,它在where子句中进行过滤。它使用古老的连接语法,而不是ANSI标准。

我希望你没有学习那些缺点的SQL。

+0

这是在我的书中:(请给我推荐一些好的资源学习SQL更加有效地 – NoNameY0 2013-03-22 18:09:00

+0

@Richard麦肯纳 - 这个论坛是最好的来源还有,你没有说明你是怎么处理这种情况的学生还没有在S2002,也ANSI所学课程的情况下,其SQL – Art 2013-03-22 18:11:16

+0

@Gordon Linoff的版本。 SQL是我想学习的东西,最好是最新版本。这个论坛没有标准的课程来教你SQL。请帮忙 – NoNameY0 2013-03-22 18:13:01