我遇到了从外部加入工作的情况转移到失败的问题。
工作(伪代码示例)
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条记录
我做错了什么?
答案 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