PostgreSQL子查询规范
我正在处理几个SQL查询以供练习,但在这方面遇到了一些问题 我试图找到“SYS”跟踪“CptS”专业学生注册的不同课程,然后返回课程编号和这些课程的学分。结果应根据courseno进行排序 这些表可以从文件中创建。它是一个zip文件,包含用于创建表的SQL语句 它们需要创建的顺序如下:课程、曲目、学生、注册、预请求、曲目要求 我在计算课程数量时遇到了困难,这些课程只是在课程要求中,而不是所有注册的课程 以下是我迄今为止的SQL语句:PostgreSQL子查询规范,sql,postgresql,Sql,Postgresql,我正在处理几个SQL查询以供练习,但在这方面遇到了一些问题 我试图找到“SYS”跟踪“CptS”专业学生注册的不同课程,然后返回课程编号和这些课程的学分。结果应根据courseno进行排序 这些表可以从文件中创建。它是一个zip文件,包含用于创建表的SQL语句 它们需要创建的顺序如下:课程、曲目、学生、注册、预请求、曲目要求 我在计算课程数量时遇到了困难,这些课程只是在课程要求中,而不是所有注册的课程 以下是我迄今为止的SQL语句: SELECT student.sname, student.s
SELECT student.sname, student.sid, student.major FROM enroll, student, trackrequirements
WHERE student.trackcode = trackrequirements.trackcode AND student.major = trackrequirements.major AND enroll.sid = student.sid AND enroll.courseno = trackrequirements.courseno
GROUP BY student.sname, student.sid, student.major
HAVING COUNT(trackrequirements.courseno) = COUNT(enroll.courseno)
ORDER BY student.sname
如果有人能给我一些建议或帮助,我将不胜感激
以下是模式:
CREATE TABLE Course (
courseno VARCHAR(7),
credits INTEGER NOT NULL,
enroll_limit INTEGER,
classroom VARCHAR(10),
PRIMARY KEY(courseNo),
);
CREATE TABLE Tracks (
major VARCHAR(7),
trackcode VARCHAR(10),
title VARCHAR(30),
PRIMARY KEY(major, trackcode)
);
CREATE TABLE Student (
sID CHAR(8),
sName VARCHAR(30),
major VARCHAR(10),
trackcode VARCHAR(10),
PRIMARY KEY(sID),
FOREIGN KEY (major,trackcode) REFERENCES Tracks(major,trackcode)
);
CREATE TABLE Enroll (
courseno VARCHAR(7),
sID CHAR(8),
grade FLOAT NOT NULL,
PRIMARY KEY (courseNo, sID),
FOREIGN KEY (courseNo) REFERENCES Course(courseNo),
FOREIGN KEY (sID) REFERENCES Student(sID)
);
CREATE TABLE Prereq (
courseNo VARCHAR(7),
preCourseNo VARCHAR(7),
PRIMARY KEY (courseNo, preCourseNo),
FOREIGN KEY (courseNo) REFERENCES Course(courseNo),
FOREIGN KEY (preCourseNo) REFERENCES Course(courseNo)
);
CREATE TABLE TrackRequirements (
major VARCHAR(7),
trackcode VARCHAR(10),
courseNo VARCHAR(7),
PRIMARY KEY (major,trackcode,courseNo),
FOREIGN KEY (major,trackcode) REFERENCES Tracks(major,trackcode),
FOREIGN KEY (courseNo) REFERENCES Course(courseNo)
);
以下是一些数据的外观:
谢谢你的阅读
课程:
('CptS121',4,24,'Sloan175'), ('CptS122',4,25,'Sloan175'), ('CptS223',3,25,'Sloan150'), ('CptS260',3,3,'Sloan150'), ('CptS322',3,20,'Sloan169'), ('CptS323',3,19,'Sloan169')
注册:
('MATH115','12584189',3),
('MATH115','12534189',2),
('MATH115','12524189',4),
('CE211','12584189',3.5),
('CE211','12534189',2.5)
预请求:
('CptS122','CptS121'),
('CptS223','CptS122'),
('CptS322','CptS223'),
('CptS323','CptS322')
学生:
('12584489','Aaron','ME',NULL),
('12584189','Macy','CE',NULL),
('12583889','John','MATH',NULL)
('12583589','Alice','CptS','SYS')
轨道要求:
('CptS','SE','CptS121'),
('CptS','SE','CptS122'),
('CptS','SE','CptS223'),
('CptS','SE','CptS260')
轨道:
('CptS','SE','Software Engineering Track'),
('CptS','SYS','Systems Track'),
('CptS','G','General Track'),
('EE','CE', 'Computer Engineering Track'),
('EE','ME', 'Microelectronics Track'),
('EE','POW','Power Track');
这是我当前的输出:
sname sid major
Ali 12582389 CptS
Alice 12583589 CptS
Bill 12581189 CptS
Jack 12584789 CptS
这是所需的输出:
sid sname major
12584789 Jack CptS
显示的数据只是全部数据的一部分,如果您想查看全部数据,请告诉我
非常感谢您的帮助,如果我需要更改其他内容,请告诉我
感谢您阅读我不得不调整您的数据以保持关系完整性。有了这些,您需要的是下面的查询。当然,您需要将where类替换为与您的问题相关的条件。您可以转到此处查看下面查询的实时运行。构建此类查询的经验法则是遵循以下基本步骤:
- 隔离您需要的输出
- 找出提供所需输出的表格
- 查找表之间的任何关系
- 如果缺少关系,请查找可以完成联接的表
- 将筛选条件添加到where子句
- 完成最终输出需求,如排序、分组
select distinct s.sname, c.courseno, c.credits from trackrequirements t
JOIN enroll e ON e.courseno = t.courseno
JOIN student s ON s.sID = e.SID AND t.major = s.major AND t.trackcode = s.trackcode
JOIN course c ON c.courseno = t.courseno
where t.major = 'CptS' AND t.trackcode = 'SE'
ORDER BY c.courseno;
在某个地方,你需要一些过滤器,比如
track='SYS'和major='CptS'
我在查询中的任何地方都看不到这些过滤器。