我有一个带有整个内部和左连接字符串的oracle sql查询。但是,当我添加最后一个左连接条件时,它会停止返回结果。这可能最终会成为一个简单的答案,例如“你不能从2个表中对列进行外连接”,但是我找不到任何这样的oracle规则,并且有大量示例显示相反的情况。 sql查询是:
FROM a, b,
c, d,
e, f,
g, h,
(SELECT id5 FROM
some_table WHERE
conditions) i,
(SELECT id7, type FROM
some_other_table WHERE
conditions) j
WHERE b.time in (range) AND
b.count <> 0 AND
b.id1 = e.id1 AND
e.type = g.type AND
g.type2 = f.type2 AND
b.id2 = a.id2(+) AND
b.time = a.time(+) AND
b.id3 = c.id3(+) AND
b.time = c.time(+) AND
c.id4 = d.id4(+) AND
c.time = d.time(+) AND
c.id5 = i.id5(+) AND
c.time = h.time(+) AND
c.id6 = h.id6(+) AND
h.id7 = j.id7(+); --AND
--e.type = j.type(+);
当我取消注释最终条件时,不会返回任何结果。因为这应该是外部联接,所以不应该发生。那么,这里的一些东西必须使它不像外部联接?
这里有错误或错误吗?我有破坏的神谕规则吗?什么可以通过切换到ANSI连接格式来解决?
由于
答案 0 :(得分:1)
要么在将查询翻译成简单形式时遗漏了一些内容,要么我在操作中遗漏了一些内容,但看起来查询可能没有按照您的想法进行。用标准ANSI形式重写更具启发性:
FROM a
right outer join b
on b.id2 = a.id2
AND b.time = a.time
right outer join c
on c.id3 = b.id3
AND c.time = b.time
left outer join d
on d.id4 = c.id4
AND d.time = c.time
join e
on e.id1 = b.id1
cross join f
join g
on g.type = e.type
AND g.type2 = f.type2
left outer join h
on h.time = c.time
AND h.id6 = c.id6
left outer join(
SELECT id5 FROM
some_table WHERE
conditions) i
on i.id5 = c.id5
left outer join(
SELECT id7, type FROM
some_other_table WHERE
conditions) j
on j.id7 = h.id7
and j.type = e.type --> the criteria in question
where b.time in (range)
AND b.count <> 0;
这看起来对你好吗?你没有提到RIGHT OUTER加入,但我希望你忘了。你确实提到了INNER连接,但是表f根本没有连接标准,所以我使用了CROSS连接,希望这也是你的意图。
表e的连接标准是应该的吗?根据你设置的模式,我希望在这里看到“id5”而不是“id1”。当然,您已经更改了所有名称以提交简化示例,因此这可能毫无意义。所以我建议的第一件事是你使用真实的表和列名称将原始代码重写为ANSI表单。你可能会看到一些东西。
您是正确的,添加标记的条件应该对结果集中的行数没有影响。既然如此,还有其他事情要发生。
要找出答案,请注释掉整个最后一次加入。如果你看到一些棘手的问题,请继续注释掉表格以找出问题所在。如果一切看起来都很好,只执行形成“table”j的嵌套查询。我无法想到它可能包含的任何可能导致你解释它的情况,但无论如何要检查它。
最后,如果所有其他方法都失败了,则只使用表e和j进行查询,然后只使用表h和j(以及相应的连接标准)。看看会发生什么。
然后回到这里并向我们解释问题是如何在其他地方一直存在的。 :)
答案 1 :(得分:0)
问题(正如对问题的评论中所建议的)是h.id7 = j.id7(+) AND e.type = j.type(+)
在功能上等同于a.id1 = b.id1(+) and c.id2 = b.id2(+)
。 oracle连接语法不够精确,不足以看到,由于其他连接条件,这不是完全外连接,因此不允许这样做。
这应该会导致错误,但查询中的其他内容会抑制错误,我不清楚这是怎么回事。无论如何,切换到ANSI格式允许我更精确地指定连接条件,并且查询按预期工作。