2017-06-06 48 views
0

我试图在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(+); 

是这样的吗?

+2

“sid”代表什么?由于学生没有地点或部门,所以不是学生证。四个桌子中的一个桌子上的“sid”是否独一无二? –

+0

@Gordon Linoff:我也打算给Oracle添加标签:-)但是后来我想也许OP不使用Oracle,但只能从Internet获得语法。因此,我的答案是这个语法只有Oracle。 –

+0

我想你可能需要一个完整的外部连接,因为可能会有学生没有大学院校和学生。 –

回答

2

这是一种老式的外联方式,数据库为Oracle。对于Oracle来说,这个说法是正确的在其他DBMS中它是无效的。无论如何,现在(从Oracle 9i开始;在其他数据库管理系统中)应该使用标准的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; 
+0

感谢您接受此答案。但是请阅读Bob的回答。他有一个点。 “sid”的确看起来很可疑,正如我在第一条评论中已经写过的那样。 –

0

给你已经证明这样看来,你真正想要的是

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显然是一个“学生证”,但在名为COLLEGE,LOCATIONS或DEPARTMENTS的表上有一个“学生证”字段是不合理或不合适的。也许你需要更新你的设计,以允许任何数量的学生与其中一个实体关联,也许使用“连接”表。

祝你好运。