PostgreSQL子查询规范

PostgreSQL子查询规范,sql,postgresql,Sql,Postgresql,我正在处理几个SQL查询以供练习,但在这方面遇到了一些问题 我试图找到“SYS”跟踪“CptS”专业学生注册的不同课程,然后返回课程编号和这些课程的学分。结果应根据courseno进行排序 这些表可以从文件中创建。它是一个zip文件,包含用于创建表的SQL语句 它们需要创建的顺序如下:课程、曲目、学生、注册、预请求、曲目要求 我在计算课程数量时遇到了困难,这些课程只是在课程要求中,而不是所有注册的课程 以下是我迄今为止的SQL语句: SELECT student.sname, student.s

我正在处理几个SQL查询以供练习,但在这方面遇到了一些问题

我试图找到“SYS”跟踪“CptS”专业学生注册的不同课程,然后返回课程编号和这些课程的学分。结果应根据courseno进行排序

这些表可以从文件中创建。它是一个zip文件,包含用于创建表的SQL语句

它们需要创建的顺序如下:课程、曲目、学生、注册、预请求、曲目要求

我在计算课程数量时遇到了困难,这些课程只是在课程要求中,而不是所有注册的课程

以下是我迄今为止的SQL语句:

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'
我在查询中的任何地方都看不到这些过滤器。