繁体   English   中英

在Oracle11g SQL中联接三个表

[英]Joining three tables in Oracle11g SQL

通常,这对我来说不是问题,但是1.我的教练从未教过我们如何联接三个这样的表和2.甚至在本周的作业中也没有涉及。 但是因为这些数据库不在我们通常使用的Oracle接口数据库中,所以我什至无法进行反复试验。

我有三张桌子。 内容对这个问题并不重要。 第一个表是STUDENTS,具有LAST_NAME,SID和MID列(此处两个MID单元具有NULL值)。 第二个表是COURSES,其列为COURSES(不知道为什么设计此问题的人决定将其命名为与表相同)和CID(我假设这是主键)。第三个表是ENROLLED,其列为SID和CID 。

我被问到以下问题“使用上面显示的三个表来回答以下问题:a。您将使用哪种联接来联接所有三个表?编写将产生所需结果的语法。b。命名两个表可以用来从自然联接中检索数据。编写可产生所需结果的语法。”

我被困在这一个。 到目前为止,Internet并没有太大帮助,甚至Oracle的资料也没有。 我们了解了联接的知识,但从未联接两个以上的表。 任何帮助,将不胜感激。

具有LAST_NAME,SID和MID COURSES列,具有COURSES和CID ENROLLED列,具有SID和CID列的学生。

如果两个表都有一个共同的列,则一个表可以与另一个表连接。 所以这里的学生表可以和ENROLLED一起使用,

ENROLLED.SID =学生.SID

和课程可以与ENROLLED一起加入

ENROLLED.CID =课程.CID

您将使用哪种联接来联接所有三个表? 编写将产生所需结果的语法。

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

在这里,我使用左加入来显示学生,即使他没有在任何地方注册。 但是,您也可以使用内部联接来避免这种情况,也可以使用完全联接来显示所有内容-在某个地方就读的学生,未就读的学生和没有学生的课程。 在这个Stack Overflow主题中,您将很好地解释不同类型的联接如何工作。

命名两个表,这些表可用于从自然联接中检索数据。 编写将产生所需结果的语法。

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

select * from enrolled natural join students;

select * from enrolled natural join courses;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM