2015-05-02 32 views
-2

我一直在考虑这个SQL代码如下:我需要一只手用SQL任务

CREATE TABLE Student (
stdNo  CHAR(5)  PRIMARY KEY, 
login  CHAR(10) UNIQUE NOT NULL, 
lastname VARCHAR(25), 
givenNames VARCHAR(50), 
programCode CHAR(4)) 
go 

CREATE TABLE Course (
courseID CHAR(8)  PRIMARY KEY, 
cName  VARCHAR(25) UNIQUE NOT NULL, 
credits  TINYINT  CHECK (credits BETWEEN 0 AND 200) DEFAULT 20) 
go 

CREATE TABLE Semester (
semesterID INTEGER  PRIMARY KEY CHECK (semesterID >= 0), 
semester TINYINT   NOT NULL CHECK(semester BETWEEN 0 AND 4), 
year  SMALLINT  NOT NULL CHECK(year BETWEEN 2000 AND 9999), 
UNIQUE (semester,year)) 



go 

CREATE TABLE Register (
stdNo  CHAR(5), 
courseID CHAR(8), 
semesterID INTEGER   REFERENCES Semester ON UPDATE CASCADE ON DELETE NO ACTION, 
grade  CHAR(2), 
mark  DECIMAL(5,2) DEFAULT 0.0, 
PRIMARY KEY (stdNo, courseID, semesterID), 
CONSTRAINT fkRegisterStd FOREIGN KEY(stdNo) REFERENCES Student(stdNo) ON UPDATE CASCADE ON DELETE NO ACTION, 
FOREIGN KEY(courseID) REFERENCES Course(courseID) ON UPDATE CASCADE ON DELETE NO ACTION) 
go 


INSERT INTO Student VALUES ('S0001', 'ABI723', 'Ingel', 'Abby Kate', 'BITC'); 
INSERT INTO Student VALUES ('S0210', 'KWE231', 'Kent', 'Robert', 'BSCS'); 

INSERT INTO Course VALUES ('INFT2040', 'Database Management', 20); 
INSERT INTO Course VALUES ('INFT2132', 'Advance Programming', 20); 
INSERT INTO Course VALUES ('INFT4001', 'Project', 20); 

INSERT INTO Semester VALUES (1,1, 2014); 
INSERT INTO Semester VALUES (2,2, 2014); 
INSERT INTO Semester VALUES (3,1, 2007); 

INSERT INTO Register VALUES ('S0001', 'INFT2040', 1, 'A', 98.02); 
INSERT INTO Register VALUES ('S0001', 'INFT2132', 2, 'B', 80.32); 
INSERT INTO Register VALUES ('S0210', 'INFT2132', 2, 'B+', 87.89); 
INSERT INTO Register VALUES ('S0210', 'INFT2040', 3, null, null); 

我问到“查找谁已经注册到同一课程,“罗伯特·肯特学生的学号“”。我怎么能够解决这个问题?有人可以提供一个例子吗?

我意识到连接表的能力,我只是不确定如何实际完成任务。

回答

1

一种方式做这将是一个子选择:

select cs.givenNames, cs.lastname 
    from Register cr 
    join Student cs on cr.stdNo = cs.stdNo 
    where (cs.givenNames != 'Robert' and cs.lastname != 'Kent') 
    and cr.courseID in (
select r.courseID 
    from Student s 
    join Register r on r.stdNo = s.stdNo 
    where givenNames = 'Robert' 
    and lastname = 'Kent' 
) group by cs.givenNames, cs.lastname; 

但它也可以做单加入:

select cs.givenNames, cs.lastname 
    from Student s 
    join Register r on r.stdNo = s.stdNo 
    join Register cr on cr.courseID = r.courseID 
    join Student cs on cr.stdNo = cs.stdNo 
    where s.givenNames = 'Robert' 
    and s.lastname = 'Kent' 
    and s.stdNo != cs.stdNo 
    group by cs.givenNames, cs.lastname; 

我会离开它作为一个练习来决定哪些效率更高。

+0

谢谢,这真的有帮助,我没有回想起使用'on'和'in'。对此,我真的非常感激 :-) – Charles