Sql 如何在四个表上应用左外部联接条件?
我试图在4个表上应用联接。但我找不到合适的结果。 我有4张桌子,像1.学生,2.学院,3.地点,4.系。所以我在所有表中都有相同的列sid,可以用来连接条件。 我想要下面select语句中提到的四个表中的所有匹配行,以及左表中的未匹配行,左表是左外部联接工作 我试过这种语法Sql 如何在四个表上应用左外部联接条件?,sql,oracle,join,left-join,Sql,Oracle,Join,Left Join,我试图在4个表上应用联接。但我找不到合适的结果。 我有4张桌子,像1.学生,2.学院,3.地点,4.系。所以我在所有表中都有相同的列sid,可以用来连接条件。 我想要下面select语句中提到的四个表中的所有匹配行,以及左表中的未匹配行,左表是左外部联接工作 我试过这种语法 select students.sname, college.cname, locations.loc, department.dept from students, college, locaions,
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(+);
这是对的吗?这是一种老式的外部连接Oracle数据库的方式。对于甲骨文来说,这句话是正确的;在其他数据库管理系统中,它是无效的 无论如何,现在(从Oracle9i开始;在其他数据库管理系统中的时间要长得多),您应该使用标准的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;
这是一种老式的外部连接Oracle数据库的方式。对于甲骨文来说,这句话是正确的;在其他数据库管理系统中,它是无效的 无论如何,现在(从Oracle9i开始;在其他数据库管理系统中的时间要长得多),您应该使用标准的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;
鉴于你所展示的,你真正想要的似乎是
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
原始查询中的问题是,由于外部联接是可选联接,因此最终可能会在其中一个联接字段中返回NULL值,从而阻止任何下游值的联接。我同意@ThorstenKettner的观点,他在一篇评论中指出,SID显然是一个“学生ID”,但在名为COLLEGE、Location或DEPARTMENTS的表中使用“学生ID”字段是不合理或不适当的。也许您需要更新您的设计,以允许任意数量的学生与这些实体中的一个相关联,可能需要使用“联接”表
祝你好运。鉴于你所展示的,你真正想要的似乎是
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
原始查询中的问题是,由于外部联接是可选联接,因此最终可能会在其中一个联接字段中返回NULL值,从而阻止任何下游值的联接。我同意@ThorstenKettner的观点,他在一篇评论中指出,SID显然是一个“学生ID”,但在名为COLLEGE、Location或DEPARTMENTS的表中使用“学生ID”字段是不合理或不适当的。也许您需要更新您的设计,以允许任意数量的学生与这些实体中的一个相关联,可能需要使用“联接”表
祝你好运。sid代表什么?我肯定不是学生证,因为学生没有地点或部门。
sid
在这四个表中是唯一的吗?@Gordon Linoff:我也正要给Oracle加上标签:-),但后来我想也许OP不使用Oracle,而只是从互联网上获得了语法。因此,我的回答是,此语法仅适用于Oracle。我认为您可能需要在此处使用完整的外部联接,因为可能会有学生带出学院和学院带出学生。@access\u已授予。有趣。我认为一个学生(好的,一个大学生)必须进入一所大学(或同等学历)。类似地,我很难想象一个没有学生的教育机构“学院”(当然不是选举团)。比如,一个辍学者,或者有人还在申请。将每个人都称为学生可能比引入两个实体(人和学生)看起来更干净。至于没有学生的学院-看看sid
代表什么?我肯定不是学生证,因为学生没有地点或部门。sid
在这四个表中是唯一的吗?@Gordon Linoff:我也正要给Oracle加上标签:-),但后来我想也许OP不使用Oracle,而只是从互联网上获得了语法。因此,我的回答是,此语法仅适用于Oracle。我认为您可能需要在此处使用完整的外部联接,因为可能会有学生带出学院和学院带出学生。@access\u已授予。有趣。我认为一个学生(好的,一个大学生)必须进入一所大学(或同等学历)。类似地,我很难想象一个没有学生的教育机构“学院”(当然不是选举团)。比如,一个辍学者,或者有人还在申请。将每个人都称为学生可能比引入两个实体(人和学生)看起来更干净。至于没有学生的学院,请查收,谢谢你接受这个答案。但也要读鲍勃的答案。他说得有道理。sid
这件事看起来确实可疑,正如我在第一条评论中所写的。感谢您接受这个答案。但也要读鲍勃的答案。他说得有道理。sid
这件事看起来确实可疑,正如我在第一条评论中所写的那样。