【问题标题】:How can i apply left outer join conditions on four tables?如何在四个表上应用左外连接条件?
【发布时间】:2017-06-06 16:14:31
【问题描述】:

我试图在 4 个表上应用联接。但我找不到合适的结果。 我有 4 个表,例如 1.students、2.college、3.locations、4.departments。所以我在所有可用于连接条件的表中都有相同的列 sid。 我想要四个表中的所有匹配行,如下面的 select 语句中提到的列,以及左表中不匹配的行,这是左外连接工作。

我已经尝试过这种语法。

select 
  students.sname,
  college.cname,
  locations.loc,
  department.dept 
from students, college, locaions, departments 
where student.sid=college.sid(+) 
and college.sid=locations.sid(+) 
and locations.sid=department.sid(+);

这样对吗?

【问题讨论】:

  • sid 代表什么?我敢肯定,这不是学生证,因为学生没有地点或部门。 sid 在四个表之一中是唯一的吗?
  • @Gordon Linoff:我也正要标记 Oracle :-) 但后来我想也许 OP 不使用 Oracle,而只是从 Internet 上获得了语法。因此,我的回答是这种语法仅限于 Oracle。
  • 我认为您可能需要一个完整的外部连接,因为可能有没有大学的学生和没有学生的大学。
  • @access_granted 。 . .有趣的。我认为学生(嗯,college 学生)必然被大学(或同等学历)录取。同样,我很难想到没有学生的教育机构“学院”(当然不是选举学院)。
  • 嗯,例如辍学或仍在申请的人。将每个人都称为学生可能看起来比引入 2 个实体(人和学生)更简洁。至于没有学生的大学 - 看看southharmoninstituteoftechnology.org

标签: sql oracle join left-join


【解决方案1】:

这是在 Oracle 数据库中进行外部连接的老式方法。对于 Oracle,这个说法是正确的;在其他 DBMS 中无效。

无论如何,现在(从 Oracle 9i 开始;在其他 DBMS 中更长)您应该改用标准 SQL 连接。

select 
  s.sname,
  c.cname,
  l.loc,
  d.dept 
from students s
left outer join college c on c.sid = s.sid
left outer join locations l on l.sid = c.sid
left outer join departments d on d.sid = l.sid;

【讨论】:

  • 感谢您接受这个答案。但也请阅读鲍勃的回答。他有一个观点。 sid 的事情看起来很可疑,正如我在第一条评论中所写的那样。
【解决方案2】:

鉴于您所展示的内容,您真正想要的是

select s.sname,
       c.cname,
       l.loc,
       d.dept 
from students s
LEFT OUTER JOIN college c
  ON c.SID = s.SID
LEFT OUTER JOIN locations l
  ON l.SID = s.SID
LEFT OUTER JOIN departments d 
  ON d.SID = s.SID

原始查询中的问题是,由于 OUTER JOIN 是可选连接,因此您最终可能会在其中一个连接字段中返回 NULL 值,从而阻止任何下游值被连接。我同意@ThorstenKettner 的观点,他在评论中指出 SID 显然是一个“学生 ID”,但是在名为 COLLEGE、LOCATIONS 或 DEPARTMENTS 的表上设置一个“学生 ID”字段是不合理或不合适的。也许您需要更新您的设计以允许任意数量的学生与这些实体之一相关联,可能使用“连接”表。

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-18
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 2012-07-28
    • 2016-11-23
    相关资源
    最近更新 更多