在将2个表连接在2列上但一个列使用(+)但另一列不使用(+)的情况下,我对Oracle的左右连接有一个疑问。我正在尝试转换一大堆查询,并将它们更改为适当的联接,对此感到好奇。
使用(+)联接的查询有效,但是当转换为适当的左/右联接时,结果将有所不同。请参阅示例代码。
-OLD
select *
from tbl1 a, tbl2 b
where a.col1 = b.col1 (+)
and a.col2 = b.col2
-已转换
select *
from tbl1 a
left join tbl2 b on a.col1 = b.col1 and a.col2 = b.col2
有没有办法使转换后的代码像旧代码一样工作?
谢谢。
RS ..
答案 0 :(得分:0)
您的第一个查询将不会执行left outer join
,但会执行inner join
,因为在没有(+)
的情况下,这就是为什么使用新的联接格式更适合于可读性和较低复杂性的原因。
如果您确实要坚持使用(+)
的旧联接格式,则可以使用以下代码。
select *
from tbl1 a, tbl2 b
where a.col1 = b.col1 (+)
and a.col2 = b.col2 (+)
上面的代码将正确执行left outer join
,因为与该表相关的所有条件现在都被标记为(+)
但是,建议您使用新的联接格式,即使用LEFT JOIN
语法。
希望,它将清除您的疑虑。
干杯!
答案 1 :(得分:0)
如果您只是想转换为ANSI语法,那么您应该知道您的旧查询是作为内部联接而不是外部联接执行的。转换后的查询应为:
select *
from tbl1 a
join tbl2 b on (
b.col1 = a.col1
and b.col2 = a.col2
)
如果您认为自己偶然发现了一个错误,并且该查询应作为外部联接执行,那么您的查询将是:
select *
from tbl1 a
left join tbl2 b on (
b.col1 = a.col1
and b.col2 = a.col2
)
如果您要重复与原始查询相同的错误,即实际上是作为内部联接执行时似乎是外部联接...查询将是:
select *
from tbl1 a
left join tbl2 b on (
b.col1 = a.col1
)
where b.col2 = a.col2