2015-05-02 31 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