Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在四个表上应用左外部联接条件?_Sql_Oracle_Join_Left Join - Fatal编程技术网

Sql 如何在四个表上应用左外部联接条件?

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,

我试图在4个表上应用联接。但我找不到合适的结果。 我有4张桌子,像1.学生,2.学院,3.地点,4.系。所以我在所有表中都有相同的列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(+);

这是对的吗?

这是一种老式的外部连接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
这件事看起来确实可疑,正如我在第一条评论中所写的那样。