我正在学习数据库和查询。使用下表 - 我无法重组 - 我试图找到两件事:
我以这种方式开始了我的第一个查询,但是我有一个语法错误:StudentTable SID NAME YEAR MAJOR GPA 1111 Smith Senior CS 3.51 2222 Jones Freshman IT 4.00 3333 Jacks Junior CS 2.75 4444 Johns Senior CS 3.12 CourseTable COURSEID CNAME CREDITS 1111 Reading 1 2222 Counting 1 3333 Drawing 3 4444 Swimming 3 5555 Physics 3 6666 Database 3 7777 Hacking 3 8888 Emailing 3 9999 Internship 1 EnrollmentTable SID COURSE1 COURSE2 COURSE3 COURSE4 1111 9999 null null null 2222 1111 2222 3333 4444 3333 6666 7777 8888 null 4444 8888 9999 null null
DECLARE @courseID varchar(10) = (
select COURSEID from Assignment5Schema.CourseTable
where CNAME = 'Database'
)
SELECT StudentTable.NAME from EnrollmentTable
where (
COURSE1=@courseID or
COURSE2=@courseID or
COURSE2=@courseID or
COURSE3=@courseID or
COURSE4=@courseID
) and StudentTable.MAJOR = 'CS'
更新:我现在正在根据其他用户的回答尝试这种方式。我正在尝试修改它,因为我发现它没有正确过滤CS专业。我相信它现在正在运作。
SELECT s.name
FROM student s
JOIN enrollment e ON e.sid = s.sid
JOIN course c ON s.major = 'CS' AND c.cname = 'Database' AND (c.courseid = e.course1 OR c.courseid = e.course2 OR c.courseid = e.course3 OR c.courseid = e.course4);
答案 0 :(得分:1)
要获取获取数据库类的CS专业的名称,您需要将表连接在一起。您可以加入studentid匹配的学生和注册表,然后您可以将其加入课程表。您还可以在连接条件中包含类名称为数据库。这看起来像这样:
SELECT s.name
FROM student s
JOIN enrollment e ON e.sid = s.sid
JOIN course c ON c.cname = 'Database' AND (c.courseid = e.course1 OR c.courseid = e.course2 OR c.courseid = e.course3 OR c.courseid = e.course4);
这些表只会连接到学生行中其中一列是数据库类的行。
对于第二个,首先将其分成几部分。找到GPA低于3.5的学生很容易,因为您只需要一个where子句:
SELECT s.name
FROM student s
WHERE s.gpa < 3.5;
我不想为你完成整个任务,所以我希望所提出的想法可以帮助你完成第二个任务。您需要做的是在注册表中搜索少于9个学分的学生,并将其与上述查询一起加入,以获得小于9学分且gpa小于3.5的学生
我已经用SQL Fiddle测试了一些你可以用来测试你的作品。
修改强>
我为解决第二个问题所做的第一件事就是加入了与赛道相匹配的任何条件。这给出了一个表格,其中包含每个学生和课程的行。换句话说,学生一行一行,学生二行四行,依此类推。有关示例,请参阅下一个Fiddle链接。
SELECT *
FROM enrollment e
JOIN course c
ON c.courseid = e.course1
OR c.courseid = e.course2
OR c.courseid = e.course3
OR c.courseid = e.course4;
然后我意识到我可以按学生ID对行进行分组,并在总和小于9的条件下求和:
SELECT e.sid, SUM(c.credits) AS totalCredits
FROM enrollment e
JOIN course c ON c.courseid = e.course1 OR c.courseid = e.course2 OR c.courseid = e.course3 OR c.courseid = e.course4
GROUP BY e.sid
HAVING totalCredits < 9;
然后,正如我所说,我可以将前两个子查询加在一起并得到他们的名字,如下所示:
SELECT t.name
FROM(
SELECT s.sid, s.name
FROM student s
WHERE s.gpa < 3.5) t
JOIN(
SELECT e.sid, SUM(c.credits) AS totalCredits
FROM enrollment e
JOIN course c ON c.courseid = e.course1 OR c.courseid = e.course2 OR c.courseid = e.course3 OR c.courseid = e.course4
GROUP BY e.sid
HAVING totalCredits < 9) w ON w.sid = t.sid;
以下是更新后的Fiddle。
答案 1 :(得分:0)
Select s.Name
from StudentTable s
left outer join Assignment5Schema a on s.SID = a.SID
where (COURSE1=@courseID or
COURSE2=@courseID or
COURSE2=@courseID or
COURSE3=@courseID or
COURSE4=@courseID)
and s.Major = '%CS%'
如果您对表的结构有任何控制权,我会更改该分配表。分手。
| SID |课程#| SLOT |
插槽是1 - 4。
通过这种方式,您可以对课程编号进行查询,而不是对表格本身的属性进行查询......如果这有意义的话。