在 Oracle11g 中连接三个表 SQL

Joining three tables in Oracle11g SQL

通常情况下,这对我来说不是问题,但是 1. 我的老师从来没有教过我们如何像这样加入三个 table 和 2. 这甚至没有包含在本周的作业中.但是因为这些数据库不是我们平时使用的Oracle接口数据库,我连试错都没有办法。

我有三个 table。内容对问题并不重要。 第一个 table 是 STUDENTS,包含 LAST_NAME、SID 和 MID 列(此处的两个 MID 单元格具有 NULL 值)。 第二个 table 是 COURSES,包含 COURSES 列(不知道为什么设计这个问题的人决定将其命名为 table)和 CID(我假设这是一个主键) 第三个 table 已注册,包含列 SID 和 CID。

有人问我以下问题 "使用上面显示的三个 table 回答以下问题: 一种。您将使用哪种连接来连接所有三个 table? 编写将产生所需结果的语法。 b.说出两个可用于从自然连接中检索数据的 table。 编写将产生所需结果的语法。"

我卡在了这个上。到目前为止,Internet 没有多大帮助,甚至 Oracle 的资料也没有。我们学习了加入,但我们从未加入超过两个 table。任何帮助将不胜感激。

STUDENTS,包含 LAST_NAME、SID 和 MID 列 COURSES,包含 COURSES 和 CID 列 已注册,包含 SID 和 CID 列。

一个 table 可以与另一个 table 连接,如果两个 table 有一个共同的列。 所以这里的 STUDENTS TABLE 可以加入 ENROLLED,

ENROLLED.SID=STUDENTS.SID

并且可以通过 ENROLLED 加入课程

ENROLLED.CID=COURSES.CID

What kind of join would you use to join all three tables? Write the syntax that would produce the desired result.

select last_name, courses
  from students 
    left join enrolled on students.sid = enrolled.sid
    left join courses on enrolled.cid = courses.cid

select last_name, courses from students
  left join (select * from enrolled join courses using (cid)) using (sid)

SQLFiddle

这里我使用了 left join 来显示学生,即使他没有在任何地方注册。但是您也可以使用 inner join(s) 来避免这种情况或者 full join 显示所有内容 - 在某处注册的学生、未注册的学生和没有学生的课程。 在这个 Stack Overflow topic 你很好地解释了不同类型的连接是如何工作的。

Name two tables that could be used to retrieve data from a natural join. Write the syntax that would produce the desired result.

这些对是:ENROLLED 和 STUDENTS(公共密钥 SID)以及 ENROLLED 和 COURSES(公共密钥 CID)。

select * from enrolled natural join students;

select * from enrolled natural join courses;

您可以使用SQLFiddle 来测试您自己的想法,就像我第一次查询时使用的那样。从列表框中选择数据库(Oracle), 接下来在左侧面板中构建模式(创建表、插入数据),然后在右侧面板中编写查询。 如果查询成功运行,结果将在底部可见。