多表连接 - 我可以为此添加外连接吗?

时间:2010-11-11 15:58:22

标签: sql outer-join

我遇到了从外部加入工作的情况转移到失败的问题。

工作(伪代码示例)

SELECT a.number, a.name, b.ref, c.ref, c.firmref
FROM jobs a, teams b LEFT OUTER JOIN teamfirms c ON b.ref = c.team
WHERE a.ref = b.job

始终填充的作业和团队(每个作业的许多团队)之间存在多对一的关系

表c中可能有也可能没有公司,但上面的查询给出了我期望的结果(约5000条记录)

当我想从第四张桌子引入有关球队的详细信息时,问题出现了

我正在尝试的代码在

之下
SELECT a.number, a.name, b.ref, c.ref, c.firmref, d.name
FROM jobs a, teams b LEFT OUTER JOIN teamfirms c ON b.ref = c.team, firms d
WHERE a.ref = b.job
AND d.ref = c.firmref

此时我试图捕获的NULLS消失了,我丢弃了大约500条记录

我做错了什么?

5 个答案:

答案 0 :(得分:4)

您正在混合ANSI 89和92 JOIN语法(隐式和显式JOIN)。尝试将整个查询转换为显式JOIN。问题很可能是您添加的新JOIN(隐式语法)是INNER并且想要是OUTER,或者您想要以不同的顺序解析JOIN(一旦您将它们全部写为OUTER,就可以使用parens)联接)

答案 1 :(得分:4)

对此采取行动。

select a.number, a.name, b.ref, c.ref, c.firmref, d.name
from jobs a left outer join teams b on b.job = a.ref
left outer join teamfirms c on b.ref = c.team
left outer join firms d on c.firmref = d.ref
left outer join table e on a.column = e.column

或者你可以做到

select a.number, a.name, b.ref, c.ref, c.firmref, d.name
from
jobs a, teams b, teamfirms c, firms d
where
a.ref = b.job
and b.ref = c.team
and c.firmref = d.ref

一个或另一个......不是两个。

只是为了好好衡量一下......

  

使用INNER JOIN返回所有行   从两个表中都有一个   比赛。即。在结果表中所有   行和列将具有值。

     

LEFT OUTER JOIN返回所有行   从第一张桌子,即使在那里   在第二个表中没有匹配项。

     

RIGHT OUTER JOIN返回所有行   从第二张桌子,即使有   在第一个表中没有匹配。

答案 2 :(得分:0)

尝试以下内容:

SELECT 
  a.number, a.name, b.ref, c.ref, c.firmref, d.name 
FROM 
 jobs a, teams b 
     LEFT OUTER JOIN teamfirms c ON b.ref = c.team
        LEFT OUTER JOIN firms d on c.firmref = d.ref
WHERE a.ref = b.job 

如果有效,您可以尝试将第二个LEFT OUTER转换为INNER。可能不正确的是,当我需要这种东西时,我通常将它留作外层。

答案 3 :(得分:0)

这是我的尝试:

SELECT a.number, a.name, b.ref, c.ref, c.firmref, d.name 
FROM jobs a
 join teams b on (b.job = a.ref)
 LEFT OUTER JOIN teamfirms c ON (b.ref = c.team)
 LEFT OUTER JOIN firms d on (d.ref = c.firmref)

这将把所有工作加入团队,如果团队存在,那么也会带来坚定的细节。如果没有团队合作关系,你仍然可以得到你的空白。

答案 4 :(得分:-1)

尝试以下方法:

SELECT a.number, a.name, b.ref, c.ref, c.firmref, d.name
FROM jobs a, teams b LEFT OUTER JOIN teamfirms c ON b.ref = c.team
LEFT OUTER JOIN firms d ON c.firmref = d.ref
WHERE a.ref = b.job