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

Смежные вопросы