2013-03-22 53 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