使用Inner Joins将三个表连接在一起

时间:2015-01-03 04:08:32

标签: sql oracle

使用表别名,列出在java基础模块上注册的学生的名字,姓氏和开始日期:

我在运行下面的查询时遇到了一些麻烦。

SELECT stu.StudFName, stu.StudLName, enrol.StartDate
From Student stu
INNER JOIN Enrolment enrol
ON stu.StudID = enrol.StudID
INNER JOIN Module mod
ON enrol.ModCode = mod.ModCode
WHERE mod.ModName = 'Java Fundamentals'

结构:

CREATE TABLE Student
(StudID       INTEGER       PRIMARY KEY,
 StudFName    VARCHAR(10)   NOT NULL,
 StudLName    VARCHAR(10)   NOT NULL,
 DoB          DATE          NOT NULL,
 Sex          CHAR(1)       NOT NULL CHECK (Sex IN ('M', 'F')),
 Email        VARCHAR(30)   UNIQUE);


CREATE TABLE Staff
(StaffID      INTEGER       PRIMARY KEY,
 Title        VARCHAR(4)    CHECK (Title IN ('Prof', 'Dr', 'Mr', 'Mrs', 'Miss')),
 StaffFName   VARCHAR(10)   NOT NULL,
 StaffLName   VARCHAR(10)   NOT NULL,
 Email        VARCHAR(30)   UNIQUE,
 Department   VARCHAR(25)   DEFAULT 'Not Assigned',
 Extension    INTEGER       CHECK (Extension BETWEEN 0001 AND 9999));


CREATE TABLE Module
(ModCode      CHAR(4)       PRIMARY KEY,
 ModName      VARCHAR(25)   NOT NULL,
 ModCredits   INTEGER       NOT NULL CHECK (ModCredits IN (15, 30, 45, 60)),
 ModLevel     CHAR(3)       NOT NULL CHECK (ModLevel   IN ('UG1', 'UG2', 'UG3', 'MSc')),
 ModLeader    INTEGER       NOT NULL,
 Foreign Key (ModLeader)    REFERENCES Staff (StaffID));


CREATE TABLE Enrolment
(ModCode      CHAR(4)       NOT NULL,
 StudID       INTEGER       NOT NULL,
 StartDate    DATE          NOT NULL,
 PRIMARY KEY (ModCode, StudID),
 Foreign Key (StudID)  REFERENCES Student (StudID),          
 Foreign Key (ModCode) REFERENCES Module (ModCode)); 

1 个答案:

答案 0 :(得分:0)

答案是......您的查询没有问题。

它运作得很好。 查看here

INSERT INTO Student (StudID, StudFName, StudLName, DoB, Sex, Email) VALUES
(1, 'Jack', 'Black', TO_DATE('2015/01/01', 'yyyy/mm/dd'), 'M', 'jack@email.com');
INSERT INTO Student (StudID, StudFName, StudLName, DoB, Sex, Email) VALUES
(2, 'Andrew', 'Wiggin', TO_DATE('2015/01/01', 'yyyy/mm/dd'), 'M', 'andrew@email.com');
INSERT INTO Student (StudID, StudFName, StudLName, DoB, Sex, Email) VALUES
(3, 'Bob', 'Marley', TO_DATE('2015/01/01', 'yyyy/mm/dd'), 'M', 'bob@email.com');

INSERT INTO Staff (StaffID, Title, StaffFName, StaffLName, Email, Extension) VALUES
(1, 'Prof', 'Joe', 'Smith', 'stuff@emal.com', 0001);

INSERT INTO Module (ModCode, ModName, ModCredits, ModLevel, ModLeader) VALUES
(1, 'Java Fundamentals', 30, 'UG1', 1);
INSERT INTO Module (ModCode, ModName, ModCredits, ModLevel, ModLeader) VALUES
(2, 'C# Fundamentals', 15, 'UG2', 1);

INSERT INTO Enrolment (ModCode, StudID, StartDate) VALUES
(1, 1, TO_DATE('2015/01/01', 'yyyy/mm/dd'));
INSERT INTO Enrolment (ModCode, StudID, StartDate) VALUES
(1, 2, TO_DATE('2015/01/02', 'yyyy/mm/dd'));
INSERT INTO Enrolment (ModCode, StudID, StartDate) VALUES
(2, 3, TO_DATE('2015/01/03', 'yyyy/mm/dd'));

-------------------------------------------------------------
SELECT stu.StudFName, stu.StudLName, enrol.StartDate
From Student stu
INNER JOIN Enrolment enrol ON stu.StudID = enrol.StudID
INNER JOIN Module mod ON enrol.ModCode = mod.ModCode
WHERE mod.ModName = 'Java Fundamentals'

结果

STUDFNAME   STUDLNAME   STARTDATE
----------------------------------------
Jack        Black       January, 01 2015
Andrew      Wiggin      January, 02 2015